【发布时间】:2018-02-14 16:24:12
【问题描述】:
在统一初始化期间使用尾随逗号时是否存在任何潜在的语义差异?
std::vector< std::size_t > v1{5, }; // allowed syntax
std::vector< std::size_t > v2{10};
我可以使用尾随逗号使编译器选择std::vector::vector(std::initializer_list< std::size_t >) 构造函数而不是std::vector::vector(std::size_t, const std::size_t &) 还是有任何其他具有上述语法的技巧?
我可以用它来检测std::initializer_list-constructor是否重载?
考虑以下代码,必须选择哪个构造函数?
struct A { A(int) { ; } A(double, int = 3) { ; } };
A a{1};
A b{2, };
此代码is accepted by gcc 8 和A(int) 在两种情况下都被选中。
【问题讨论】:
-
第一个(
std::initializer_list-constructor)总是被选中。 wandbox.org/permlink/Yy6VtcK5ISCbzZJp -
无论如何,
v2{...}没有理由调用任何构造函数,但采用std::initializer_list....的构造函数只有v2(...)会调用std::vector::vector(std::size_t...) -
@songyuanyao 是的,但是如果只有具有一元和二元数的构造函数具有可能的默认函数参数初始化器和其他情况怎么办?在所有可以想到的情况下,是否存在任何语义差异?
-
@jpo38 实际上 v1 和 v2 都会调用 initializer_list 重载,请参见此处:stackoverflow.com/questions/9723164/…
-
@StoryTeller OP 在我编辑时更改了问题。我不只是为了好玩而随机更改。但还是我的坏。感谢您收集并更正。
标签: c++ c++14 language-lawyer c++17 uniform-initialization