- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 toConstructible<T>
(18.4.11 [concept.constructible]), which is equivalent tois_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/
C++20 添加了一个名为 std::default_initializable 的概念.与 std::is_default_constructible 相比命名的差异似乎太明显了,不可能是偶然的。
我是一名优秀的程序员,十分优秀!