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
使用する必要があります。auto
static auto const value = N % 360;
質問:新しいC ++ 11標準によると、どのコンパイラが正しいですか?