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();
}
};

GCC говорит нет:

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)?

7

Решение

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

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

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

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

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

13

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]