Могут ли атрибуты применяться к параметрам конструктора? - PullRequest
4 голосов
/ 21 мая 2019

Clang 8.0.0 и GCC 9.1.0, похоже, не согласны с тем, является ли это действительным кодом.

struct Foo {
  Foo([[maybe_unused]] int x) {}
};
int main() {}

Clang не выдает предупреждений (даже при -Wall -Wextra -Wpedantic), но GCC выдает эту ошибку:

test.cpp:2:7: error: expected unqualified-id before '[' token
    2 |   Foo([[maybe_unused]] int x) {}
      |       ^
test.cpp:2:7: error: expected ')' before '[' token
    2 |   Foo([[maybe_unused]] int x) {}
      |      ~^
      |       )

Так в каком компиляторе есть ошибка?

Ответы [ 3 ]

4 голосов
/ 21 мая 2019

Да, они могут быть применены.Стандарт допускает это.

10.6.6 Возможно, неиспользуемый атрибут [dcl.attr.unused]
...
2 Атрибут может применяться к объявлению класса, typedef-имени, переменной, нестатического члена данных, функции, перечисления или перечислителя.

Так что Clang здесь прав, и это ошибка GCC.Отчет об ошибке уже подан под таким названием: Атрибут Maybe_unused вызывает синтаксическую ошибку при использовании в первом аргументе конструктора

4 голосов
/ 21 мая 2019

Ваш код действителен

Атрибут [[maybe_unused]] может применяться к объявлению struct, enum, union, typedef, переменная (включая переменные-члены), функция или перечислитель. Реализации рекомендуется не выдавать диагностику, когда такой объект не используется или когда объект используется несмотря на отмечается как [[maybe_unused]].

Однако для этого уже есть отчет об ошибке в атрибуте gcc Maybe_unused, который вызывает синтаксическую ошибку при использовании первого аргумента в конструкторе . gcc, вероятно, не может правильно его проанализировать.

0 голосов
/ 21 мая 2019

Вероятно, это проблема в вашей строке компиляции GCC.Я получаю похожую ошибку при запуске следующей строки:

gcc *.cpp -o run_me

Однако при использовании следующей строки не возникает никаких проблем:

gcc -std=c++17 *.cpp -o run_me -Wall -Wextra -Wpedantic

Запуск со стандартным c ++ 11 дастпредупреждение «использование атрибута Maybe_unused» является расширением C ++ 17 ».Обязательно используйте c ++ 17 при компиляции этого кода.

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