Разрешено ли "this" внутри спецификации noexcept? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть некоторый код, который требует от меня использования *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 Ответ

0 голосов
/ 24 октября 2018

Да, это разрешено. [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 не реализует. сообщение об ошибке .

...