6

Angleモジュロ360度の縮小値を内部的に格納するクラスを実装する次の簡略化されたテンプレートメタプログラミングコードについて考えてみます。

#include <iostream>
#include <typeinfo>

template<int N, int D>
struct Modulus
{
        static auto const value = N % D;
};

template<int N>
struct Angle
{
        static auto const value = Modulus<N, 360>::value; // ERROR
        //static int const value = Modulus<N, 360>::value;  // OK
        //static auto const value = N % 360;                // OK

        typedef Angle<value> type;
};

int main()
{
        std::cout << typeid(Angle<30>::type).name() << "\n";
        std::cout << typeid(Angle<390>::type).name() << "\n";

        return 0;
}

Ideoneの出力

Visual C ++ 2010 Expressでは可能ですstatic auto const = Modulus<N, 360>::valueが、MinGW gcc 4.7.2(Nuwen distro)またはIdeone(gcc 4.5.1)では、型を明示的に示すか、完全なモジュラー式でstatic int const value = Modulus<N, 360>::value使用する必要があります。autostatic auto const value = N % 360;

質問:新しいC ++ 11標準によると、どのコンパイラが正しいですか?

4

1 に答える 1

1

コードは有効です。Visual C ++はそれを受け入れるのは正しいですが、gccはそれを拒否するのは間違っています(完全を期すために、Clang 3.1もコードを受け入れます)。仕様には、(C ++ 11 7.1.6.4 [dcl.spec.auto] / 4):

auto タイプ指定子は、クラス定義のメンバー仕様内に表示される中括弧または等しいイニシャライザーを使用して静的データメンバーを宣言する際にも使用できます。

あなたvalueは静的データメンバーです。ブレースまたはイコールイニシャライザー= Modulus<N, 360>::value宣言の一部)があり、イニシャライザーはクラス定義のメンバー仕様内に表示されますつまり、人間が「インラインイニシャライザー」と呼ぶ場合があります)。

于 2012-10-11T18:25:48.480 に答える