gpt4 book ai didi

c++ - 使用元编程进行自动 + 静态类内常量初始化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:19 24 4
gpt4 key购买 nike

考虑以下实现 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 标准,哪个编译器是正确的?

最佳答案

代码有效。 Visual C++ 接受它是正确的,而 gcc 拒绝它是错误的(为了完整性,Clang 3.1 也接受代码)。规范指出 (C++11 7.1.6.4[dcl.spec.auto]/4):

The auto type-specifier can also be used...in declaring a static data member with a brace-or-equal-initializer that appears within the member-specification of a class definition.

你的 value是静态数据成员。它有一个 brace-or-equal-initializer(即声明的 = Modulus<N, 360>::value 部分),并且初始化器出现在类定义的成员规范中(即,凡人可能称之为“内联初始化器”)。

关于c++ - 使用元编程进行自动 + 静态类内常量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12834874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com