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;
格式良好。
LWG第3338期
突出了is_default_constructile
特征与最初命名为default_constructile
的C++20概念之间的含义差异,如果LWG问题3151被接受:
讨论
[...] 在LEWG的讨论中已经明确指出,3149将改变概念,要求默认初始化有效,而不是is_default_constructile
特征要求的值初始化有效。 LEWG也认为,如果一个特性和概念的名称非常相似,但含义却略有不同,这会让人感到困惑[...]
并随后核准了从
即,将default_constructile
概念重命名为default_initializable
:
拟议决议:
[...] 将稳定名称“[Concept.DefaultConstructile]”更改为“[Concept.Default.Init]”,并将“ConceptDefault_Constructile
”重新标题为“ConceptDefault_Initializable
”。 用default_initializable
替换对名称default_constructile
的所有引用(共出现20次)。