【发布时间】:2018-02-06 05:08:10
【问题描述】:
C++ 中的初始化列表构造函数经常会引起麻烦;例如
using std::vector;
using std::string;
vector<string> v{3}; // vector of three empty strings
vector<int> u{3}; // vector of one element with value 3
(澄清一下,我的意思是<int> 构造函数是初始化列表构造函数,而<string> 是不是。)
int case 匹配初始化列表构造函数,而 string case 不匹配。这有点难看,并且经常引起麻烦。在 Scott Meyers 的 Effective Modern C++ 的早期章节(第 7 项)中也提到了这一点,他将其描述为标准中有些令人不快的部分,即每当初始化列表构造函数可用时,编译器都会跳过去尝试匹配它,赋予它高于其他所有构造函数的优先级。
当然,通过将 u{3} 更改为 u(3) 可以轻松修复 int 大小写,但这不是重点。
这是可取的行为吗? C++ 标准委员会是否有任何讨论或计划来解决这种模棱两可/不愉快的问题?一个例子是要求初始化列表构造函数像这样调用:vector<int> u({3}),目前已经是合法的。
【问题讨论】:
-
这是two opposing forces 造成的混乱。但是不能告诉你他们是否在讨论它。
-
原本可以很容易地通过使 {n} 仅映射到类型 N 的列表来修复它,如果只是用于 std 容器,但机会已经过去了,我认为这将是一个修复它的重大突破。
-
使用 () 并不总是合法的,请参阅 MVP
-
显然这是fixing another "problem" 的结果,其中
array<int,2> a = {1,2};是允许的,但array<int,2> a{1,2};是不允许的。现在那个是固定的,但是......
标签: c++ c++11 constructor initializer-list c++-standard-library