我想要一个constexpr从constexpr函数计算的值(即编译时常量).我想要将这两个作用于类的命名空间,即静态方法和类的静态成员.
我第一次写这个(对我来说)明显的方式:
class C1 {
constexpr static int foo(int x) { return x + 1; }
constexpr static int bar = foo(sizeof(int));
};
Run Code Online (Sandbox Code Playgroud)
g++-4.5.3 -std=gnu++0x 对此说:
error: ‘static int C1::foo(int)’ cannot appear in a constant-expression
error: a function call cannot appear in a constant-expression
Run Code Online (Sandbox Code Playgroud)
g++-4.6.3 -std=gnu++0x 抱怨:
error: field initializer is not constant
Run Code Online (Sandbox Code Playgroud)
好吧,我想,也许我必须把事情从课堂上移开.所以我尝试了以下方法:
class C2 {
constexpr static int foo(int x) { return x + 1; }
constexpr static int bar;
}; …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
struct Literal
{
int val;
constexpr Literal(int const& val) : val(val) {}
constexpr Literal(Literal const& rhs) : val(rhs.val) {}
};
struct Parent
{
struct StaticObject
{
Literal const zero;
constexpr StaticObject() :zero(0) {}
};
static constexpr StaticObject outer{};
};
Run Code Online (Sandbox Code Playgroud)
行'static constexpr StaticObject outer {};' 给我错误:
'表达式没有评估为常数'
接下来是
注意:失败是由调用未定义的函数或未声明'constexpr'的函数引起的
注意:请参阅'Parent :: StaticObject :: StaticObject'的用法
据我所知,这里使用的所有函数都是定义和声明的constexpr.我错过了什么,或者这是一个编译器错误?