在这个参考页面上,对于std::tuple
类型的默认构造函数指出,当且仅当对于至少一个索引值i
,类型Ti
不是隐式默认可构造的时候,该构造函数才是“显式”的。
我有点困惑“隐式默认可构造”是什么意思。能否给我一个例子?
这里有一个例子:
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::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);
当类型A
不具备隐式默认构造函数时,std::tuple<std::string, A>
无法隐式默认构造:
struct A
{
explicit A() = default;
};
void f(std::tuple<std::string, A>);
f({}); // error
T t = {};
不需要复制或移动构造函数,因此您可以创建一个。 - chris{}
初始化const T&
。” - Kerrek SB