"T t = {};" 和 "T t{};" 会产生不同的结果吗?
Can "T t = {};" and "T t{};" produce different results?
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明将产生不同的结果?
T t1 = {};
T t2{};
我已经研究了 cppreference 和标准一个多小时了,我理解了以下内容:
T t2{};
是一个 value initialization。这里没有惊喜。
T t1 = {}
是一个 list initialization,带有一个空的 braced-init-list。
但是最后一个很棘手,因为 "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
}
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明将产生不同的结果?
T t1 = {};
T t2{};
我已经研究了 cppreference 和标准一个多小时了,我理解了以下内容:
T t2{};
是一个 value initialization。这里没有惊喜。T t1 = {}
是一个 list initialization,带有一个空的 braced-init-list。
但是最后一个很棘手,因为 "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
}