什么是"替代语法"[[出现在属性之外?

Pub*_*bby 6 c++ c++11

我不明白这个:

(7.6.1)只有在引入属性指定符时才会出现两个连续的左方括号标记.[注意:如果在不允许属性指定的情况下出现两个连续的左方括号,即使括号与替代语法生成匹配,程序也会形成错误. - 尾注] [例子:(略微修改自来源)

// ...
void f() {
int x = 42, y[5];
  // ...
  y[[] { return 2; }()] = 2; // error even though attributes are not allowed
                             // in this context.
}
Run Code Online (Sandbox Code Playgroud)

可以[[使用什么替代语法?如果属性不存在,示例是否有效(示例的作用是什么)?

Xeo*_*Xeo 2

该示例创建了一个简单的 lambda,它被直接调用并且仅返回2。这将从数组中获取第三个元素并将其分配给2。可以重写如下:

int foo(){ return 2; }

int y[5];

y[foo()] = 2;
Run Code Online (Sandbox Code Playgroud)

甚至

int y[5];

auto foo = []{ return 2; }; // create lambda

y[foo()] = 2; // call lambda
Run Code Online (Sandbox Code Playgroud)

现在,如果属性不存在,那么该示例当然是格式良好的,因为您引用的部分将不存在。

  • 实际上添加一对“()”应该足以解决这个问题。`y[([]{返回 2;}())] = 2;` (5认同)
  • @Pubby:选择“[]”作为 lambda 诱导子序列的原因是因为没有合法的情况可以使用“[”而前面没有标识符或其他表达式。因此,如果没有 lambda,`[[` 就不可能成为合法的标记序列。 (3认同)