从初始化列表中推导构造函数的模板参数
Template parameter deduction for constructors from initializer list
在Kona meeting, template parameter deduction for constructors (P0091R0) 已获批准。它简化了一些变量定义:
std::pair p {1,2}; // o.k., constructor pair<int,int>(1,2)
std::vector v1 (10, 0); // o.k., 10 zeroes, constructor vector<int>(size_t n, T initvalue)
std::vector v2 {10, 0}; // o.k., 2 values: 10, 0, apparently initializer list?
std::vector v3 = {10, 0}; // o.k., same as v2?
但是,以下行在 gcc 7 HEAD 201611 版本 (live example) 中无法编译:
std::vector v4 = {3}; // error: no matching function for call to 'std::vector(int)'
std::vector v5 {1, 2, 3}; // error: 'int' is not a class
std::set s {1, 2, 3}; // error: no matching function for call to 'std::set(int,int,int)'
这些只是 "a bridge too far",因为它们涉及初始化列表吗?
它们是否包含在模板类型参数推导中?
当编译器符合 C++1z 时,它们会被允许吗?
您需要一对额外的大括号才能使您的代码正常工作:
std::vector v4 = {{1, 5}};
std::vector v5 {{1, 2, 3}};
std::set s {{1, 2, 3}};
因为要调用foo::foo(const initializer_list &)
构造函数,需要告诉编译器正好一个参数,所以需要额外的一对圆括号或大括号:
std::vector v5 ({1, 2, 3});
std::set s ({1, 2, 3});
^ ^
通过这种方式,编译器知道您调用的函数只有一个参数 const initializer_list &
,而不是具有三个 int
的函数。
在Kona meeting, template parameter deduction for constructors (P0091R0) 已获批准。它简化了一些变量定义:
std::pair p {1,2}; // o.k., constructor pair<int,int>(1,2)
std::vector v1 (10, 0); // o.k., 10 zeroes, constructor vector<int>(size_t n, T initvalue)
std::vector v2 {10, 0}; // o.k., 2 values: 10, 0, apparently initializer list?
std::vector v3 = {10, 0}; // o.k., same as v2?
但是,以下行在 gcc 7 HEAD 201611 版本 (live example) 中无法编译:
std::vector v4 = {3}; // error: no matching function for call to 'std::vector(int)'
std::vector v5 {1, 2, 3}; // error: 'int' is not a class
std::set s {1, 2, 3}; // error: no matching function for call to 'std::set(int,int,int)'
这些只是 "a bridge too far",因为它们涉及初始化列表吗? 它们是否包含在模板类型参数推导中? 当编译器符合 C++1z 时,它们会被允许吗?
您需要一对额外的大括号才能使您的代码正常工作:
std::vector v4 = {{1, 5}};
std::vector v5 {{1, 2, 3}};
std::set s {{1, 2, 3}};
因为要调用foo::foo(const initializer_list &)
构造函数,需要告诉编译器正好一个参数,所以需要额外的一对圆括号或大括号:
std::vector v5 ({1, 2, 3});
std::set s ({1, 2, 3});
^ ^
通过这种方式,编译器知道您调用的函数只有一个参数 const initializer_list &
,而不是具有三个 int
的函数。