c++ - 不清楚最烦人的解析

标签 c++ struct constructor default-constructor most-vexing-parse

<分区>

让我们假设下面的类 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 .

If boolalpha == 0, then converts v to type int and performs integer output.

使用 std::boolalpha 可以看得更清楚.

cout << boolalpha << foo2  << endl;  // print out "true"

关于c++ - 不清楚最烦人的解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57146468/

相关文章:

c - 如何修复我的代码以从函数返回指向结构的指针

c - 如何使用 C 中的 offsetof() 和指针在结构中填充数组

c - 如何构建每个函数调用或宏只有一个字段的结构?

java - 将值应用于对象时出错

java - 对象创建过程中究竟发生了什么? ( java )

c++ - 指向结构的二维数组。内存访问问题

c++ - 如何对 C++ 项目进行逆向工程?

c++ - 使用 std::function 中函数的类型来声明该类型的多个函数

java - Java中如何使用父类抽象复制构造函数复制子类?

c++ - 为什么 std::istringstream 只能在此处与构造函数一起使用?