最烦人的解析C++11
Most vexing parse C++11
本文关键字:C++11 更新时间:2023-10-16
我对这条线到底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();
}
这条线到底有什么作用
它创建一个临时X
,通过调用默认构造函数对其进行值初始化,然后使用它来初始化Y
变量,调用const X&
转换构造函数。
与最烦人的解析的连接在哪里
如果你尝试使用老式的初始化语法来编写它
Y y (X());
然后所谓的"最烦人的解析"会将其解释为一个函数,而不是一个变量,声明:一个名为 y
的函数,返回类型为 Y
和单个参数,其类型是返回 X
的(指针指向 a)函数。
您可以添加额外的括号,以便它不能被解释为函数声明:
Y y ((X()));
或者,从 C++11 开始,您可以像示例一样使用大括号初始化。
Y y { X{} };
这是完美的,y
将类型X
的临时对象传递给构造函数来创建一个对象。没有令人烦恼的解析(大多数或其他)。实际上,引入使用 {}
的构造是为了解决在许多情况下令人烦恼的解析问题,例如:
Y y1();
Y y2(X());
两者都属于(大多数)令人烦恼的解析,因此两者都声明函数而不是对象。
但是,如果使用称为大括号初始化的大括号:
Y y1{};
Y y2{ X{} }; //as you've done yourself
然后,两者都按预期声明对象,而不是函数。
相关文章:
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- C++11 迭代向量的新方法?