Является ли это объявление noexcept действительным?

#c #visual-c #g #clang

#c #visual-c #g #clang

Вопрос:

 struct X
{
    void f() noexcept(noexcept(g()));
    void g() noexcept;
};
  

В vc и clang это работает, но gcc жалуется:

 source_file.cpp:6:34: error: ‘g’ was not declared in this scope
     void f() noexcept(noexcept(g()));
                                  ^
  

Я думаю, что это ошибка в gcc, а не функция в других. Это правильно?

Ответ №1:

Ваша оценка верна

В спецификации члена класса класс считается завершенным в телах функций, аргументах по умолчанию, спецификаторах noexcept и инициализаторах членов по умолчанию (включая такие вещи во вложенных классах). В противном случае оно считается неполным в пределах его собственной спецификации члена класса.

В области полного типа g должно быть найдено с помощью неквалифицированного поиска имени.