【发布时间】:2020-09-12 10:20:24
【问题描述】:
问题很简单。有没有可能构造出这样一个类型T,下面的两个变量声明会产生不同的结果?
T t1 = {};
T t2{};
我已经研究了一个多小时的 cppreference 和标准,我明白了以下内容:
-
T t2{};是 value initialization。这里没有惊喜。 -
T t1 = {}是一个 list initialization,带有一个空的括号初始化列表。
但最后一个很棘手,因为“列表初始化的影响”是一个令人印象深刻的......列表。对于类、基本类型和聚合,这似乎归结为值初始化。但我不确定我没有错过任何东西。
也许你可以提供一个上下文,其中两个声明会产生不同的效果?
UPD:关于explicit 构造函数的优秀答案!下一级:是否有可能两个语句都编译,但对编译/运行时间有不同的影响?
【问题讨论】:
-
回复:UPD。现在你只是很难! ???我发现了一种情况,即两者都 fail 编译(但出于不同的原因),但是在它们都编译但给出不同结果的情况下工作。诡计多端。
-
我可以将您的第一个案例更改为:
T t1 = std::initializer_list<int>{};。你会考虑,还是我在作弊? -
T t1 = std::initializer_list<int>{};绝对是作弊,因为我对我提供的确切表格感兴趣。 -
“我发现了一个两个都无法编译的案例(但原因不同)”——这也很有趣!可以分享一下吗?
-
这是一个很好的“联合国”,可以肯定!只要你在大括号内输入一个值,它就变得很容易实现。问题在于让编译器将
{}明确视为(空)初始化列表。
标签: c++ initialization language-lawyer