Разрешено ли "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-seqX
”Между необязательным 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 не реализует. Отчет об ошибке.