Разрешено ли "this" внутри спецификации noexcept?

У меня есть код, который требует от меня использовать *this, но я хочу, чтобы он был не дружелюбным

struct foo;

// Would actually be something with conditional noexcept
void do_something(foo&);

struct foo {
    void fn()
        noexcept(noexcept(::do_something(*this)))
    {
        ::do_something(*this);
    }
};

Тем не менее, gcc отклоняет это:

<source>:7:43: error: invalid use of 'this' at top level
         noexcept(noexcept(::do_something(*this)))

Если я просто получаю доступ к члену, gcc в порядке:

void do_something(int);

struct bar {
    int x;

    void fn()
        noexcept(noexcept(::do_something(x)))
    {
        ::do_something(x);
    }
};

Однако, если я получу доступ к члену через this указатель, gcc снова жалуется:

struct baz {
    int x;

    void fn()
        noexcept(noexcept(::do_something(this->x)))
    {
        ::do_something(this->x);
    }
};

Диагностика:

<source>:7:42: error: invalid use of 'this' at top level
         noexcept(noexcept(::do_something(this->x)))

Любой другой компилятор, который я пробовал, принимает использование this внутри спецификации noexcept, но на самом деле я не знаю, есть ли в gcc ошибка или все остальные компиляторы.

Может ключевое слово this использоваться внутри спецификации noexcept?

1 ответ

Решение

Да, это разрешено. [expr.prim.this] p2 говорит:

Если объявление объявляет функцию-член или шаблон функции-члена класса X, выражение this является значением типа "указатель на cv-qualifier-seq X”Между необязательным cv-qualifier-seq и концом определения функции, [...].

Cv-qualifier-seq ссылается на cv квалификаторы функции-члена, которые появляются перед спецификатором noexcept:

parameters-and-qualifiers:
    ( parameter-declaration-clause ) cv-qualifier-seq[opt] ref-qualifier[opt] 
      noexcept-specifier[opt] attribute-specifier-seq[opt]

Так, this является допустимым выражением для использования в спецификаторе noexcept. Это был DR ( cwg1207), который gcc не реализует. Отчет об ошибке.

Другие вопросы по тегам