我有一些代码要求我使用*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
吗?
答案 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。