在这个参考页面上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相比变得更加相关.
这意味着,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)