当前位置: 首页 > 知识库问答 >
问题:

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

朱睿
2023-03-14

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个答案

严兴言
2023-03-14

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次)。

 类似资料:
  • 我在下面的某个地方看到了代码片段。 由于前面提到的代码片段工作得很好,它表明std::cout是从std::ostream派生而来的。但我还找不到任何直接的参考资料。 根据文件,其中说[强调我的]: 全局对象std::cout和std::wcout控制输出到实现定义类型的流缓冲区(源自std::stream buf),与标准C输出流stdout相关联。 上面的引文表示,控制输出到派生自std::s

  • 要检查向量是否为空,我可以使用或。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗? 我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 我知道了从< code>std::async返回的< code>future具有某种特殊共享状态的原因,通过这种状态,< code >等待返回的future发生在future的析构函数中。但是当我们使用< code>std::pakaged_task时,它的未来不会表现出同样的行为。要完成打包的任务,必须从< code>packaged_task显式调用< code>future对象上的< cod

  • 并行开发挺复杂的,特别是在试图用好线程和锁的过程中。如果要用到条件变量或std-atomics(一种无锁开发方式),那就更复杂了。C++0x提供了future和promise来简化任务线程间的返回值操作;同时为启动任务线程提供了packaged_task以方便操作。其中的关键点是允许2个任务间使用无(显式)锁的方式进行值传递;标准库帮你高效的做好这些了。基本思路很简单:当一个任务需要向父线程(启动

  • 标准库函数bind()和function()定义于头文件<functional>中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var