考虑以下简化的模板元编程代码,该代码实现了一个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;
}
使用 Visual C++ 2010 Express,我可以做到static auto const = Modulus<N, 360>::value
,但使用 MinGW gcc 4.7.2( Nuwen发行版)或 Ideone(gcc 4.5.1)我必须明确将类型表示为,static int const value = Modulus<N, 360>::value
或者我必须使用auto
完整的模块化表达式 as static auto const value = N % 360;
。
问题:根据新的 C++11 标准,哪个编译器是正确的?