8

もっと言えば、このコードの問題点は次のとおりです。

#include <assert.h>
#include <functional>
using namespace std;

    template< class BaseObjectId >
    class Check
    {
    protected:
        Check( function<bool()> const f ) { assert( f() ); }
    };

    template< int tpMinValue, int tpMaxValue >
    class IntegerSubrange
        : private Check< IntegerSubrange< tpMinValue, tpMaxValue > >
    {
    private:
        int     value_;

    public:
        enum :int { minValue = tpMinValue, maxValue = tpMaxValue };

        static bool rangeContains( int const x )
        {
            return (minValue <= x && x <= maxValue);
        }

        operator int() const
        {
            return value_;
        }

        void operator/=( int const rhs )
        {
            value_ /= rhs;
            assert( rangeContains( value_ ) );
        }

        explicit IntegerSubrange( int const value )
            : Check< IntegerSubrange< tpMinValue, tpMaxValue > >(
                [=]() -> bool { return rangeContains( value ); }
                )
            , value_( value )
        {}
    };

int main() {}

Visual C++ は構文エラーを報告します:

foo.cpp
foo.cpp(41): エラー C2059: 構文エラー: ')'
        foo.cpp(44) : コンパイル中のクラス テンプレートのインスタンス化 'IntegerSubrange' への参照を参照してください
foo.cpp(42): エラー C2059: 構文エラー: ','
foo.cpp(43): エラー C2334: '{' の前に予期しないトークンがあります。見かけの関数本体をスキップする
4

1 に答える 1

4

コメントを要約すると、質問者のコードは有効です。どうやら、GCC 4.4 または Visual C++ 2011 よりも古い一部のコンパイラは、C++11 スタイルのラムダに対するコンパイラのサポートが不完全であるため、それを拒否するようです。しかし、最新のコンパイラ (および新しい C++11 標準をサポートすると主張するコンパイラ) は、問題なく処理できるはずです。

質問に文字通り答えるには: ctor-initializer-listでは、コンストラクター関数自体の中括弧内に移動した場合と同じ識別子が使用可能です (同じものを参照します)。特に、これはあなたができることを意味します

class C {
    const char *p_ = "foo";
    char c_;
    C(int): p_(__func__) { }      // referring to "__func__"
    C(double): c_(*this->p_) { }  // referring to "this"
};

この件に関して標準が述べなければならないことは次のとおりです。

mem-initializerの式リストまたは波括弧初期化リスト内の名前は、mem-initializerが指定さ れているコンストラクターのスコープで評価され ます。... [注: mem-initializer は [ sic ] コンストラクターのスコープで評価されるため、 mem-initializer の式リストでポインターを使用して、初期化されるオブジェクトを参照できます。—<em>エンドノート]     (N3337 §12.6.2 #12)this

于 2012-09-14T18:04:24.500 に答える