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});
^ ^