【发布时间】:2015-06-16 09:18:36
【问题描述】:
在他的 CppCon 2014 talke "Type Deduction and Why You Care" 中,Scott Meyers 提出了一个问题,为什么在 C++11/C++14 标准中有关于 auto 和大括号初始值设定项的特殊规则(他的问题始于 at 36m05s) .
auto 与花括号初始化列表结合的语义在 §7.1.6.4/6 中定义。
我想了想,也想不出用例。到目前为止,我看到的最接近的事情是 Bjarne Stroustrup 使用它的一个例子。
在他的Cpp 2014 talk "Make Simple Tasks Simple!" 中,他曾经使用auto 来捕获初始化程序(但仅作为一种解决方法)。
这是代码(幻灯片 30 的一部分,at 37m10s):
// auto ss1 = collect({ 1, 2, 3, 4, 5, 6 }, odd); // error: Bummer!
auto lst = { 1, 2, 3, 4, 5, 6 };
auto ss2 = collect(lst, odd); // {1,3,5}
但请注意,这只是一种解决方法。他提到这应该没有必要。相反,他更愿意直接将参数传递给函数。因此,它不能真正成为 auto 和初始化列表的良好动机。
我对 C++ 的理解还不够深入,无法判断在 Bjarne 的示例中允许初始化列表的缺点,正如他所建议的那样。无论如何,在这种情况下,它会避免使用auto。
那么,auto 和初始化列表是否只是解决本可以更好解决问题的解决方法?或者有没有很好的例子,第 7.1.6.4/6 节中的额外自动扣除规则有用?
【问题讨论】:
-
我很确定有一个 C++1z 提议让
auto x = {expr};使用expr的类型(减去允许使用非括号逗号运算符)。不过,我不确定要为完整列表使用什么其他类型。 -
@christ 我想你的意思是 N3922。斯科特迈耶斯也提到了这一点。 Visual Studio 已经实现了它,即使它不是 C++14 的一部分。这是链接:open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3922.html
-
啊,就是这个。尽管由于这种用法,我有点不得不不同意一般的说法。不过,我真的更希望它是格式错误的,并且初始化列表能够在没有额外行的情况下传递给函数。
标签: c++ c++11 auto c++14 initializer-list