隐含默认可建构意义

Implicitly default-constructible meaning?

本文关键字:默认      更新时间:2023-10-16

std::tuple的这个引用页面上,据说该类型的默认构造函数是"显式当且仅当Ti对于至少一个i不是隐式默认可构造的"。

我有点搞不清"隐式默认可构造"是什么意思。有人能给我举个例子吗?

这里有一个例子:

struct A {};
struct B { explicit B() = default; };
int main()
{
A a1 = {};
A a2 {};
// B b1 = {}; // Error, would use explicit default constructor
B b2 {};
}

由于列表初始化,自C++11以来,具有explicit的构造函数变得更加相关。

这意味着,要隐式默认构造std::tuple<T1,T2,...,Tn>,所有Ti类型都必须。

隐式默认可构造元组的示例

例如,由于std::stringstd::vector是隐式默认可构造的(它们的默认构造函数不是explicit),因此std::tuple<std::string, std::vector>是:

void f(std::tuple<std::string, std::vector<int>>);
f({}); // valid and equivalent to:
std::string sempty;
std::vector<int> vempty;
auto tsv = std::make_tuple(sempty, vempty);
f(tsv);

非隐式默认可构造元组的示例

对于非隐式默认可构造类型Astd::tuple<std::string, A>不能隐式默认构造:

struct A
{
explicit A() = default;
};
void f(std::tuple<std::string, A>);
f({}); // error