8

検討:

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();
        }
};

GCCはノーと言います:

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) のバグですか?

4

1 に答える 1

13

thiswhereを使用できるルールは、コア言語の問題 1207の結果として変更されました。実際には別の理由で、noexcept式にも影響を与えます。

以前 (C++03 の後、ただし C++11 がまだ作成されていたとき) はthis、関数本体の外で使用することはできませんでした。式は体のnoexcept一部ではないため、this使用できませんでした。

After,はcv-qualifier-seq のthis後のどこでも使用でき、質問のコードが明確に示しているように、その後に式が表示されます。noexcept

この問題の GCC 実装は不完全なようで、後続の関数の戻り値の型でのみメンバー関数を許可しますが、標準はそれ以上のものを開放しています。これをバグとして報告することをお勧めします (以前に報告されていない場合)。これは GCC bugzilla でバグ 52869としてすでに報告されています。

なんといっても、clang は C++11 モードのコードを受け入れます。

于 2013-09-18T17:08:06.390 に答える