Tri*_*dle 18 c++ explicit-constructor default-constructor c++17
在C++ 17中,标准库中的空标记类型现在具有标记的默认构造函数explicit,并且也是= default.例如,std::piecewise_construct_t现在定义为
struct piecewise_construct_t { explicit piecewise_construct_t() = default; };
Run Code Online (Sandbox Code Playgroud)
我的问题很简单,这是C++ 14改变的原因是什么?明确默认的显式默认构造函数(!)对空类的意义是什么?
(为了避免被标记为欺骗:2010年的这个问题询问了显式默认构造函数的用途,但那是在C++ 11之前和很久以前的事情,所以事情可能已经改变了.这个问题是最新的,但是答案似乎表明,无论是否存在默认构造函数,都会执行聚合初始化,因此我对最新标准中此更改的原因感到好奇.)
Cas*_*sey 16
图书馆变更的理由是LWG 2510"标签类型不应该DefaultConstructible":
std::experimental::optional,由于某些原因,指定其nullopt类型不是DefaultConstructible.它的标签类型不会这样做in_place_t,标准类型的标准也不适用.结果证明非常不幸,请考虑以下事项:Run Code Online (Sandbox Code Playgroud)#include <memory> #include <array> void f(std::array<int, 1>, int) {} // #1 void f(std::allocator_arg_t, int) {} // #2 int main() { f({}, 666); // #3 }#3的电话不明确.更糟糕的是,如果删除重载#1,则调用工作正常.标记类型的全部要点是它需要在调用中提及或者它需要是转发参数,因此能够构造类似的标记类型是没有意义的.
LWG问题与CWG 1518"显式默认构造函数和复制列表初始化"并行发展,具有有用的背景.