Mar*_*ram 8 c++ templates clang constexpr c++11
我正在尝试实现以下内容:
#include <array>
#include <cstdint>
class Class2
{
};
class Class1
{
public:
static constexpr uint8_t GetMax() { return 5; }
static constexpr uint8_t GetMin() { return 0; }
static constexpr uint8_t GetCount() { return GetMax() - GetMin() + 1; }
private:
std::array<Class2, Class1::GetCount()> m_classes;
};
Run Code Online (Sandbox Code Playgroud)
但由于错误,我无法让它工作:
非类型模板参数不是常量表达式
我正在使用Xcode 5.0.有任何想法吗?
我们这里遇到的问题在 3.3.7 - 类范围中间接描述:
typedef int c;
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK: X::c
char c;
enum { i = 2 };
};
Run Code Online (Sandbox Code Playgroud)
本段应该对此进行更多描述(9.2.2):
在类说明符的结束}处,类被认为是完全定义的对象类型(3.9)(或完整类型)。在类成员规范中,类在函数体、默认参数、异常中被视为完整的。规范,以及非静态数据成员的大括号或等于初始化器(包括嵌套类中的此类内容)。否则,它在其自己的类成员规范中被视为不完整。
由于函数体、默认参数、异常规范、大括号或等于std::array<Class2, Class1::GetCount()>初始化器都不是,在这一点上,类被认为是不完整的,所以我认为编译器可以决定何时允许或不允许 -但按照标准,不编译代码是可以的。
我能想到的唯一解决方案是您建议的解决方案,或者将 constexpr 移动到另一个(可能的基)类中。
| 归档时间: |
|
| 查看次数: |
2990 次 |
| 最近记录: |