【问题标题】:C++0x: Why forbid "braced-init-list" in "operator[]"?C++0x:为什么在“operator[]”中禁止“braced-init-list”?
【发布时间】:2011-07-18 14:41:06
【问题描述】:

我刚刚注意到,在 N3291 中标记了一个更改(5.2.1 下标 [expr.sub]):

之前,可以使用新的 braced-init-list 重载 operator[]

struct X {
    Z operator[](std::initializer_list<int>);
};
X x;
x[{1,2,3}] = 7; // OK: meaning x.operator[]({1,2,3})

现在已删除并替换为:

花括号初始化列表不得与内置下标运算符一起使用。

出了什么问题?

【问题讨论】:

  • 我看到x[{1,2,3}] 的第一反应是“嗯,这……”。也许这就是原因。这基本上创建了一个operator[],它具有不寻常的语法和一些未知数量的参数(operator[] 采用 1、2、3 或 755 个索引在概念上是否有意义?)。而且,它只会让你感到困惑:P
  • 不,我刚刚找到它:open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3236.html#798 -- 他们只是把它搬走了,因为它是一个奇怪的地方。

标签: arrays c++11 curly-braces initializer-list


【解决方案1】:

x[{1,2,3}] 不是内置的[] 运算符。它调用用户定义的运算符函数。所以深吸一口气,继续使用这个有趣的语法。

【讨论】:

  • 说得很好。我只看到了红色标记的删除线部分,感到震惊,我可能没有接受实际的“内置”字样。是的,我想我使用它。一方面,它可能非常有效(如果编程正确,则不会复制),其次,它允许非常强大的构造。 valarray 使用“隐式”类完成所有这些(以及更多)。这种语法对我来说似乎更简单。
【解决方案2】:

一些仔细的谷歌搜索将我指向issue 798,他们只是移动它到13.5.5 [over.sub],而不是删除它。

【讨论】:

    猜你喜欢
    • 2022-12-22
    • 2013-09-21
    • 1970-01-01
    • 2017-11-23
    • 2010-11-09
    • 2011-02-12
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多