Функции и атрибуты `friend` - gcc vs clang - PullRequest
0 голосов
/ 14 сентября 2018

Следующий фрагмент кода:

struct a
{
    [[nodiscard]] friend int b();
};

Выдает эту ошибку при компиляции на clang++ (trunk 342102) с -std=c++17:

<source>:3:5: error: an attribute list cannot appear here
    [[nodiscard]] friend int b();
    ^~~~~~~~~~~~~

Удаление friend или добавление тела к b предотвращает ошибку.

g++ (trunk) прекрасно компилирует код.

Живой пример с Godbolt: https://gcc.godbolt.org/z/ttTDuZ


  • Является ли этоclang++ ошибка ?Или в Стандарте есть какое-то правило, которое делает этот код некорректным?

  • Если clang++ правильно, то как правильно пометить функцию-член friend как [[nodiscard]]?

1 Ответ

0 голосов
/ 14 сентября 2018

за [dcl.attr.grammar] / 5

Каждый атрибут-спецификатор-seq считается принадлежащим некоторому объекту или оператору, идентифицированному синтаксическим контекстом, в котором он появляется ([stmt.stmt], [dcl.dcl], [dcl.decl ]). Если атрибут-спецификатор-seq , который относится к некоторой сущности или инструкции, содержит атрибут или спецификатор выравнивания , который нельзя применять к этой сущности или инструкции , программа плохо сформирована. Если атрибут-спецификатор-seq присоединяется к объявлению друга, это объявление должно быть определением. Нет атрибут-спецификатор-seq должно относиться к явной реализации .

упор шахта

Итак, лязг прямо здесь. Если у вас есть атрибут, функция должна иметь определение, если это функция друга.

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