This question already has answers here:
Why does printing a function name returns a value?
(3个答案)
去年关闭。
让我们假设以下类Foo。
如果要创建此类的实例并对其进行初始化,则应该执行以下操作:
然后我以为我会用以下代码行调用默认构造函数,但事实并非如此:
为什么foo2初始化为int(1)而不是Foo()?
我知道最烦人的解析,它告诉我,当我将一行解释为一个函数时,它就被解释为一个函数。
但是foo1()被解释为int,而不是函数,也不是Foo类。
之所以编译Foo foo2()行是因为它被解释为函数原型(prototype)。好。
为什么要编译此行?
它会打印foo2函数的地址吗?
(3个答案)
去年关闭。
让我们假设以下类Foo。
struct Foo
{
int i;
};
如果要创建此类的实例并对其进行初始化,则应该执行以下操作:
Foo foo1 = Foo();
调用构造函数。int main(void)
{
foo1 = Foo();
cout << foo1.i << " : " << foo1.j << endl; // " 0 "
}
然后我以为我会用以下代码行调用默认构造函数,但事实并非如此:
int main(void)
{
Foo foo2(); // most vexing parse
cout << foo2 << endl; // " 1 " ??? why?
foo2.i++; // error: request for member ‘i’ in ‘foo2’, which is of non-class type ‘Foo()’
}
为什么foo2初始化为int(1)而不是Foo()?
我知道最烦人的解析,它告诉我,当我将一行解释为一个函数时,它就被解释为一个函数。
但是foo1()被解释为int,而不是函数,也不是Foo类。
之所以编译Foo foo2()行是因为它被解释为函数原型(prototype)。好。
为什么要编译此行?
cout << foo2 << endl;
它会打印foo2函数的地址吗?
最佳答案
如您所说,Foo foo2();
是一个函数声明。对于cout << foo2
,foo2
将衰减为函数指针,然后隐式转换为bool
。作为非空函数指针,转换后的结果为true
。
如果不使用boolalpha
,则 std::basic_ostream<CharT,Traits>::operator<<
会将output替换为1
。
使用 true
可以更清楚地看到它。
cout << boolalpha << foo2 << endl; // print out "true"
关于c++ - 不清楚最令人烦恼的分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57146468/
10-10 11:07