"T t = {};" 和 "T t{};" 会产生不同的结果吗?

Can "T t = {};" and "T t{};" produce different results?

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

T t1 = {};
T t2{};

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

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

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

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

如果考虑这样一种情况,其中一条语句 编译,但另一条将 编译为 "different effects," 那么是的,这是一个上下文:

#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;
}

行 declaring/initializing t1 给出以下内容,其中 clang-cl:

error : chosen constructor is explicit in copy-initialization

MSVC 编译器也抱怨:

error C2512: 'T': no appropriate default constructor available
message : Constructor for class 'T' is declared 'explicit'

区别在于explicit。我设法使 msvc 有所不同,但它看起来像一个编译器错误:

#include <iostream>
#include <initializer_list>

struct T
{
    template<class... A>
    T(A...) {std::cout << "1\n";}
    explicit T() { std::cout << "2\n"; }

};


int main()
{
    T t1 = {}; // 1
    T t2{}; // 2
}