Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从初始值设定项列表中为构造函数推导模板参数_C++_Language Lawyer_C++17_Template Argument Deduction - Fatal编程技术网

C++ 从初始值设定项列表中为构造函数推导模板参数

C++ 从初始值设定项列表中为构造函数推导模板参数,c++,language-lawyer,c++17,template-argument-deduction,C++,Language Lawyer,C++17,Template Argument Deduction,会议通过了《施工人员模板参数扣减表()。它简化了一些变量定义: 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

会议通过了《施工人员模板参数扣减表()。它简化了一些变量定义:

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?
这些是否只是“过桥”,因为它们涉及初始值设定项列表? 它们是否包含在模板类型参数推断中?
当编译器符合C++1z标准时,是否允许使用它们?

您需要一对额外的大括号才能使代码正常工作:

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

由于要调用
foo::foo(const initializer\u list&)
构造函数,因此需要告诉编译器有一个exaclty参数,因此需要额外的一对括号或大括号:

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

通过这种方式,编译器知道您调用的函数只有一个参数,即
const initializer\u list&
,而不是一个有三个
int
s的函数。

我认为您的
与v3?
相同,这是一个输入错误。@John Zwinck:是的,谢谢,更正了。最初的建议根本没有正确的措辞。我们收到了一些消息。这与聚合初始化到底有什么关系?任何地方都没有聚合。@T.C.我认为需要使用双大括号来避免在构造
std::array
时出现的相同问题,但这对vector来说没有意义。需要双大括号的实际原因是什么?他们没有正确的措辞:/我们有一个针对standardese的修复程序,然后可能会更新实现。
std::vector v5 ({1, 2, 3});
std::set    s  ({1, 2, 3});
               ^         ^