gpt4 book ai didi

c++ - `std::default_initializable` 和 `std::is_default_constructible` 有什么区别?

转载 作者:行者123 更新时间:2023-12-01 11:55:04 33 4
gpt4 key购买 nike

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;形成良好。

最佳答案

这基本上是 LWG 3149 :

DefaultConstructible<T> is equivalent to Constructible<T> (18.4.11 [concept.constructible]), which is equivalent to is_constructible_v<T> (20.15.4.3 [meta.unary.prop]). Per 20.15.4.3 [meta.unary.prop] paragraph 8:

The predicate condition for a template specialization is_­constructible<T, Args...> shall be satisfied if and only if the following variable definition would be well-formed for some invented variable t:

T t(declval<Args>()...);
DefaultConstructible<T>需要类型为 T 的对象可以进行值初始化,而不是按预期进行默认初始化。

这个概念的动机是检查你是否可以写:
T t;
但是定义并没有检查它,它检查你是否可以写 T() .但是 T()也不意味着你可以写 T{} - 有些类型具有不同的含义:
struct S0 { explicit S0() = default; };
struct S1 { S0 x; }; // Note: aggregate
S1 x; // Ok
S1 y{}; // ill-formed; copy-list-initializes x from {}

目的是为了理智起见,简化图书馆必须处理的事情,所以我们要拒绝 S1因为只是奇怪。

然后一旦概念检查与 is_default_constructible 不同的东西, LWG 3338重命名了它。因为,不同的事物应该有不同的名称。

关于c++ - `std::default_initializable` 和 `std::is_default_constructible` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62577956/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com