C++ 自动+;静态类内常量初始化与元编程

C++ 自动+;静态类内常量初始化与元编程,c++,c++11,metaprogramming,static-members,auto,C++,C++11,Metaprogramming,Static Members,Auto,考虑以下简化的模板元编程代码,它实现了一个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

考虑以下简化的模板元编程代码,它实现了一个
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;
}
#包括
#包括
模板
结构模量
{
静态自动常数值=N%D;
};
模板
结构角
{
静态自动常量值=模数::值;//错误
//静态int常量值=模数::值;//确定
//静态自动常量值=N%360;//确定
类型定义角度类型;
};
int main()
{

STD::CUT< P >代码有效。Visual C++是正确的接受它,GCC拒绝它是错误的(为了完整性,CLAN 3.1也接受代码)。规范声明(C++ 11 7.1.4.4[DCL .SPECUA])4:< /P>
auto
类型说明符也可用于…在声明静态数据成员时使用大括号或相等的初始值设定项,该初始值设定项出现在类定义的成员规范中


您的
value
是一个静态数据成员。它有一个大括号或相等的初始值设定项(即声明的
=module::value
部分),初始值设定项出现在类定义的成员规范中(即,凡人可能称之为“内联初始值设定项”).

是的,在gcc 4.5.1中对C++11的支持仍然很不完善,您应该检查在哪个版本中有哪些功能可用。@hvd,不正确。这些功能必须声明为constexpr。@SegFault我在MinGW 4中也会遇到这些错误。7@hvd我手头没有这个规范。但是constexpr静态数据成员也是静态数据成员。+1和acceptd、 非常感谢!提交错误报告的最合适方式是什么?@rhalbersma:GCC有。不过,我不熟悉他们的错误报告程序。我建议先搜索一下,看看是否已经报告过。