gpt4 book ai didi

c++ - C++ 标准中是否有任何计划来解决初始化列表构造函数的不一致问题?

转载 作者:可可西里 更新时间:2023-11-01 15:28:50 26 4
gpt4 key购买 nike

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案例没有。这有点难看,而且经常引起麻烦。在 Scott Meyers 的 Effective Modern C++ 的早期章节(第 7 项)中也提到了这一点,他将其描述为标准中有点令人不快的部分,无论何时初始化列表构造函数可用,编译器都会跳来跳去尝试匹配它,使其优先于所有其他构造函数。

当然,可以通过更改 u{3} 轻松修复 int 大小写至 u(3) ,但这不是重点。

这是理想的行为吗? C++ 标准委员会是否有任何讨论或计划来解决这种类型的歧义/不愉快?一个例子是要求像这样调用初始化列表构造函数:vector<int> u({3}) ,目前已经合法。

最佳答案

Has there been any discussion or plans by the C++ standard committee to fix this type of ambiguity / unpleasantness?

自 C++11 以来,已经对初始化进行了许多修复。例如,您最初无法使用列表初始化 (CWG 1467) 复制构造聚合。这个非常小的修复以一种不受欢迎的方式破坏了一些代码,这导致了一个新问题来改进以前的修复以在存在 initializer_list 时撤消它。构造函数(CWG 2137)。在没有很多意想不到的后果和破坏代码的情况下,很难触及这些子句中的任何内容,即使在小情况下也是如此。我怀疑将来是否会插入对初始化进行任何类型的更改。此时,代码破坏的数量将是巨大的。

最好的解决方案就是了解初始化的陷阱并谨慎对待您正在做的事情。我的经验法则是只使用 {}当我故意需要 {} 的行为时提供,和()否则。

请注意,这与更广为人知的陷阱并没有什么不同:

vector<int> a{10}; // vector of 1 element
vector<int> b(10); // vector of 10 elements

One example would be requiring initializer list constructors to be called like this: vector<int> u({3}), which is already currently legal.

出于同样的原因,您遇到了与之前相同的问题:

vector<int> u({3});    // vector of one element: 3
vector<string> v({3}); // vector of three elements: "", "", and ""

即使您需要前者(这是不可能的),您也不能让后者成为病态的。

关于c++ - C++ 标准中是否有任何计划来解决初始化列表构造函数的不一致问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48635853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com