考虑:
class test {
private:
int n;
int impl () const noexcept {
return n;
}
public:
test () = delete;
test (int n) noexcept : n(n) { }
int get () const noexcept(noexcept(impl())) {
return impl();
}
};
海湾合作委员会说不:
test.cpp:27:43: error: cannot call member function 'int test::impl() const' with
out object
int get () const noexcept(noexcept(impl())) {
类似地:
test.cpp:27:38: error: invalid use of 'this' at top level
int get () const noexcept(noexcept(this->impl())) {
和
test.cpp:31:58: error: invalid use of incomplete type 'class test'
int get () const noexcept(noexcept(std::declval<test>().impl())) {
^
test.cpp:8:7: error: forward declaration of 'class test'
class test {
这是符合标准的预期行为,还是GCC(4.8.0)中的错误?
答案 0 :(得分:13)
“this
可以使用的规则因core language issue 1207而更改,实际上是出于其他原因,但也会影响noexcept
表达式。
之前(在C ++ 03之后,但仍在编写C ++ 11时),不允许在函数体外使用this
。 <{1}}表达式不是正文的一部分,因此无法使用noexcept
。
之后,this
可以在 cv-qualifier-seq 之后的任何地方使用,之后会出现this
个表达式,因为问题中的代码清楚地说明了这一点。 / p>
看起来这个问题的GCC实现是不完整的,并且只允许成员函数在尾随函数返回类型中,但是标准已经打开了更多。 我建议将此报告为错误(如果以前没有报告过)。这已经在GCC bugzilla报告为bug 52869。
无论它值多少,clang都接受C ++ 11模式中的代码。