2013-09-18 2 views
6

Рассматривают:noexcept зависит от noexcept функции члена

class test { 
    private: 
     int n; 

     int impl() const noexcept { 
      return n; 
     } 

    public: 
     test() = delete; 
     test (int n) noexcept : n(n) { } 

     int get() const noexcept(noexcept(impl())) { 
      return impl(); 
     } 
}; 

НКУ говорит нет:

test.cpp:27:43: error: cannot call member function 'int test::impl() const' with 
out object 
    int get() const noexcept(noexcept(impl())) { 

Аналогично:

test.cpp:27:38: error: invalid use of 'this' at top level 
    int get() const noexcept(noexcept(this->impl())) { 

и

test.cpp:31:58: error: invalid use of incomplete type 'class test' 
    int get() const noexcept(noexcept(std::declval<test>().impl())) { 
                 ^
test.cpp:8:7: error: forward declaration of 'class test' 
class test { 

Является ли это предполагаемым поведением в соответствии со стандартом или ошибкой в ​​GCC (4.8.0)?

ответ

12

Правила, в которых this могут быть использованы, изменены в результате core language issue 1207, фактически по другой причине, но так же, как и на выражениях noexcept.

До (после C++ 03, но когда C++ 11 все еще записывался), this не допускалось использовать вне тела функции. Выражение noexcept не является частью тела, поэтому this не может быть использован.

После, this можно использовать в любом месте после резюме-спецификатор-сл и noexcept выражения появляются после этого, как код в ваш вопрос ясно показывает.

Похоже, что реализация GCC этой проблемы является неполной и допускает только функции-члены в возвращаемых типах возвращаемых функций, но стандарт открыл больше, чем это. Я рекомендую сообщить об этом как об ошибке (если она ранее не сообщалась). Об этом сообщается в GCC bugzilla как bug 52869.

Что бы это ни стоило, clang принимает код в режиме C++ 11.

Смежные вопросы