This question already has answers here:
Why does printing a function name returns a value?

(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 << foo2foo2将衰减为函数指针,然后隐式转换为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