可以“T t = {};” 和“T t{};” 产生不同的结果?

Mik*_*ail 14 c++ initialization language-lawyer

问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果?

T t1 = {};
T t2{};
Run Code Online (Sandbox Code Playgroud)

我已经研究 cppreference 和标准一个多小时了,我了解以下内容:

但是最后一个很棘手,因为“列表初始化的效果”是一个令人印象深刻的......列表。对于类,基本类型和聚合似乎归结为值初始化。但我不确定我没有错过任何东西。

也许您可以提供一个上下文,其中两个声明会产生不同的效果?

UPD:关于explicit构造函数的优秀答案!下一级:是否有可能两个语句都编译,但对编译/运行时有不同的影响?

Adr*_*ica 7

如果您考虑一种情况,其中一个语句可以编译,但另一个语句不会编译为“不同的效果”,那么是的,这是一个上下文:

#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”类的构造函数被声明为“显式”