【发布时间】:2020-10-16 01:33:03
【问题描述】:
C++20 添加了一个名为std::default_initializable 的概念。与std::is_default_constructible 相比,命名上的差异似乎太明显了,不可能是偶然的。
它们的规范也有不同的措辞(至少在 cppreference 上),但是我不明白 有效 的区别是什么。
以下是 cppreference 文章的简短摘要:
std::is_default_constructible<T> 要求 T foo(); 格式正确,并假设它没有被解析为函数声明。换句话说(如果我理解正确的话),T 需要是可破坏的并且T() 需要是格式良好的。
(编辑:它似乎没有需要可破坏性,所以这是第一个区别)
另一方面,std::default_initializable 要求 T foo;、T() 和 T{} 格式正确。
这两者之间有什么有效的区别吗?
据我所知,T{} 总是被解释为T()(忽略最令人头疼的解析,这里不计算在内),所以我不确定为什么要明确提到它。此外,T() 格式良好似乎暗示 T foo; 格式良好。
【问题讨论】:
-
在概念提案审查中似乎发现了一些极端案例cplusplus.github.io/LWG/lwg-defects.html#3149 - godbolt.org/z/I64p_E
-
struct T { T(std::initializer_list <int>);}是 `T()` 和T{}不同的情况:前者格式不正确,后者格式正确。