簡體   English   中英

g++“調用”一個沒有括號的函數(不是 f() 而是 f; )。 為什么它總是返回1?

[英]g++ "calling" a function without parenthesis (not f() but f; ). Why does it always return 1?

在 c++ (GNU GCC g++) 中,我的代碼在沒有 () 的情況下“調用”了一個函數。 該功能不起作用,但編譯正常。

更令人驚訝的是,代碼總是返回 1...

有什么解釋嗎?

我希望函數名只是一個普通的指針,但似乎有點不同......

我只是偶然得到了所有 1 嗎?

#include <iostream>
using namespace std;

void pr ()
{
    cout << "sth";
}

int main()
{

pr;
cout << pr;  // output: 1
cout << *pr; // output: 1
cout << &pr; // output: 1

}

您實際上並沒有在代碼中調用pr ,而是將函數指針傳遞給cout pr在傳遞給cout時被轉換為bool 如果您預先輸入cout << boolalpha您將輸出true而不是1

編輯:
使用 C++11,您可以編寫以下重載:

    template <class RType, class ... ArgTypes>
    std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...))
    {
        return s << "(func_ptr=" << (void*)func << ")(num_args=" 
                 << sizeof...(ArgTypes) << ")";
    }

這意味着調用cout << pr將打印(func_ptr=<address of pr>)(num_args=0) 函數本身顯然可以為所欲為,這只是為了證明使用 C++11 的可變參數模板,您可以匹配任意數量的函數指針。 如果沒有指定您想要的重載(通常通過強制轉換),這仍然不適用於重載函數和函數模板。

函數名在不帶括號的情況下使用時,可以隱式轉換為函數指針。 事實上,當您取消引用或引用它時,它只剩下一個函數指針或指向函數指針的指針等。這些函數指針在打印時被隱式轉換為bool ,這就是它們簡單輸出 1 的原因。如果你想輸出函數的實際內存地址,將它轉換為一個空指針:

cout<<(void*)pr;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM