Какая «альтернативная грамматика» появляется [[помимо атрибутов? - PullRequest
6 голосов
/ 26 ноября 2011

Я не понимаю этого:

(7.6.1) Два последовательных маркера левой квадратной скобки должны появляться только при введении атрибута-спецификатора.[Примечание: если две последовательные левые квадратные скобки появляются там, где указатель атрибута не разрешен, программа плохо сформирована , даже если скобки соответствуют альтернативному производству грамматики. - конец примечания] [Пример: (слегка изменено)из источника)

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

Для какой альтернативной грамматики можно использовать [[?Будет ли пример действительным, если атрибуты не существуют (и что делает пример)?

1 Ответ

2 голосов
/ 26 ноября 2011

В примере создается простая лямбда, которая вызывается напрямую и просто возвращает 2.Это позволит получить третий элемент из массива и присвоить его 2.Можно переписать следующим образом:

int foo(){ return 2; }

int y[5];

y[foo()] = 2;

Или даже

int y[5];

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

y[foo()] = 2; // call lambda

Теперь, если атрибуты не существуют, пример, конечно, будет правильно сформирован, потому чтоуказанный вами раздел не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...