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发行版)或 Ideone(gcc 4.5.1)我必须明确将类型表示为,static int const value = Modulus<N, 360>::value或者我必须使用auto完整的模块化表达式 as static 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 回答