最令人烦恼的解析C++ 11

tes*_*ram 1 c++ c++11

Y y {X{}};对这条线究竟是做什么以及它与最令人烦恼的解析的联系感到困惑.简要说明表示赞赏:

#include <iostream>

struct X {
  X() { std::cout << "X"; }
};
struct Y {
  Y(const X &x) { std::cout << "Y"; }
  void f() { std::cout << "f"; }
};
int main() {
  Y y {X{}};
  y.f();
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 11

这条线到底是做什么的

X通过调用默认构造函数创建一个临时的,初始值的函数,然后使用它初始化一个Y变量,调用const X&转换构造函数.

哪里是连接到最烦恼的解析

如果您尝试使用旧式初始化语法来编写此内容

Y y (X());
Run Code Online (Sandbox Code Playgroud)

那么所谓的"最令人烦恼的解析"会把它解释为一个函数,而不是一个变量声明:一个函数调用y,返回类型Y和单个参数,其类型是(指向a)函数返回X.

您可以添加额外的括号,以便它不能被解释为函数声明:

Y y ((X()));
Run Code Online (Sandbox Code Playgroud)

或者,从C++ 11开始,您可以使用大括号初始化作为示例.