提问者:小点点

`std::default_initializable'和`std::is_default_constructile'之间有什么区别?


C++20添加了一个名为std::default_initializable的概念。 与std::is_default_constructile相比,命名上的差异似乎太明显了,不是偶然的。

它们的规范措辞也不同(至少在cppreference上是这样),但是我不明白有效的区别是什么。

以下是cppreference文章的简短摘要:

std::is_default_constructile要求tfoo();格式良好,假设它不被解析为函数声明。 换句话说(如果我理解正确的话),T需要是可销毁的,T()需要格式良好。

另一方面,std::default_initializable要求t foo;t()t{}格式正确。

这两者之间有什么有效的区别吗?

据我所知,t{}总是被解释为t()(忽略了大多数令人烦恼的解析,这里不算),所以我不确定为什么要显式地提到它。 此外,t()格式良好似乎意味着tfoo;格式良好。


共1个答案

匿名用户

LWG第3338期

  • 3338。 将default_constructible重命名为default_initializable

突出了is_default_constructile特征与最初命名为default_constructile的C++20概念之间的含义差异,如果LWG问题3151被接受:

讨论

[...] 在LEWG的讨论中已经明确指出,3149将改变概念,要求默认初始化有效,而不是is_default_constructile特征要求的值初始化有效。 LEWG也认为,如果一个特性和概念的名称非常相似,但含义却略有不同,这会让人感到困惑[...]

并随后核准了从

  • p1754 r1:将概念重命名为标准case for C++20,而我们仍然可以

即,将default_constructile概念重命名为default_initializable:

拟议决议:

[...] 将稳定名称“[Concept.DefaultConstructile]”更改为“[Concept.Default.Init]”,并将“ConceptDefault_Constructile”重新标题为“ConceptDefault_Initializable”。 用default_initializable替换对名称default_constructile的所有引用(共出现20次)。