2016-11-19 47 views
2

Kona会议上,构造函数(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)' 

这些仅仅是 “遥远的桥”,因为它们涉及初始化列表? 它们是否覆盖了模板类型参数推导? 当编译器符合C++ 1z时,它们会被允许吗?

+0

我认为你的“与v3相同?”是一个错字。 –

+0

@John Zwinck:是的,谢谢,纠正。 –

+1

最初的建议根本没有正确的措辞。我们有一些[大规模标准修复](https://github.com/cplusplus/draft/commit/954e86feae0c5cbb80c2c506fd5e3db4993bf60a)传入。 –

回答

3

你需要一个额外的一对大括号的正确使你的代码工作:

std::vector v4 = {{1, 5}}; 
std::vector v5 {{1, 2, 3}}; 
std::set s {{1, 2, 3}}; 
+0

为什么'std :: vector v2 {10,0};'然后呢? – ildjarn

+2

这与聚合初始化有什么关系?没有任何地方聚集。 –

+0

@ T.C。我认为需要双花括号来避免构建'std :: array'时出现的相同问题,但它对于矢量并不合适。双花括号的真正原因是什么? –

0

因为你要拨打的foo::foo(const initializer_list &)构造函数,你需要告诉编译器有exaclty一个说法,所以你需要一个额外的对括号或括号:

std::vector v5 ({1, 2, 3}); 
std::set s ({1, 2, 3}); 
      ^  ^

这样,编译器知道你调用一个函数只有一个参数作为const initializer_list &,而不是FUNC三个int s。

相关问题