Mik*_*ail 14 c++ initialization language-lawyer
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果?
T t1 = {};
T t2{};
Run Code Online (Sandbox Code Playgroud)
我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
T t2{};
是一个值初始化。这里没有惊喜。T t1 = {}
是一个带有空括号初始化列表的列表初始化。但是最后一个很棘手,因为“列表初始化的效果”是一个令人印象深刻的......列表。对于类,基本类型和聚合似乎归结为值初始化。但我不确定我没有错过任何东西。
也许您可以提供一个上下文,其中两个声明会产生不同的效果?
UPD:关于explicit
构造函数的优秀答案!下一级:是否有可能两个语句都编译,但对编译/运行时有不同的影响?
如果您考虑一种情况,其中一个语句可以编译,但另一个语句不会编译为“不同的效果”,那么是的,这是一个上下文:
#include <iostream>
class T {
public:
int data{ 0 };
explicit T() {
data = 0;
std::cout << "Default constructor" << std::endl;
}
};
int main()
{
T t1 = {};
T t2{};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
声明/初始化行t1
给出以下内容,其中clang-cl
:
错误:选择的构造函数在复制初始化中是显式的
该MSVC
编译器还抱怨:
错误 C2512:“T”:没有合适的默认构造函数可用
消息:“T”类的构造函数被声明为“显式”