![](/img/trans.png)
[英]Why does std::is_function<F> return false_type when F is deduced?
[英]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 << ≺ // 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.