隐含的默认构造意义?

Ziz*_*Tai 9 c++ c++11

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

我对"隐式默认构造"意味着什么感到困惑.有人能举个例子吗?

Ker*_* SB 11

这是一个例子:

struct A {};
struct B { explicit B() = default; };

int main()
{
    A a1 = {};
    A a2 {};

    // B b1 = {}; // Error, would use explicit default constructor
    B b2 {};
}
Run Code Online (Sandbox Code Playgroud)

explicit由于列表初始化,构造函数与C++ 11相比变得更加相关.


YSC*_*YSC 6

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

隐式默认构造元组的示例

例如,因为std::string并且std::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);
Run Code Online (Sandbox Code Playgroud)

非隐式可构造元组的示例

使用非隐式默认构造类型A,std::tuple<std::string, A>不能隐式构造默认构造:

struct A
{
    explicit A() = default;
};

void f(std::tuple<std::string, A>);

f({}); // error
Run Code Online (Sandbox Code Playgroud)