是否可以在noexcept规范中使用`this`?

时间:2018-10-24 16:55:26

标签: c++ this language-lawyer 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 rejects this

<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 complains again访问该成员,

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

我尝试过使用accepts using this inside the noexcept specification的其他所有编译器,但实际上我不知道是gcc出现了该错误还是所有其他编译器。

可以在noexcept规范内使用关键字this吗?

1 个答案:

答案 0 :(得分:10)

是的,允许。 [expr.prim.this]p2说:

  

如果声明声明了类X的成员函数或成员函数模板,则表达式this是类型为“指向 cv-qualifier-seq 的指针”的prvalue。 X”,位于可选的 cv-qualifier-seq function-definition 的末尾[...]之间。

cv-qualifier-seq 指成员函数的cv限定词,appear before the noexcept specifier

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

因此,this是在 noexcept-specifier 中使用的有效表达式。这是gcc并未实现的DR(cwg1207)。 bug report