我想使用constexpr成员函数初始化constexpr成员变量,但它没有编译。当我把这个功能移出课堂时,没关系。为什么会这样?有没有办法使用类成员constexpr函数初始化成员constexpr变量?
我正在使用Apple LLVM 8.0.0版(clang-800.0.38)。
感谢您的帮助。
constexpr static int Add_Ext(int a, int b) { return a + b; }
class Foo
{
public:
constexpr static int Add_InClass(int a, int b) { return a + b; }
// This is OK.
constexpr static int kConstantX = Add_Ext(1, 2);
// This results in a compile error.
constexpr static int kConstantY = Add_InClass(1, 2);
};
clang错误消息:
Constexpr variable 'kConstantY' must be initialized by a constant expression
答案 0 :(得分:1)
标准应该明确
constexpr
成员函数在类完成之前不能用于常量表达式。
您的代码似乎是故意无法接受的。但是,标准应该在这个问题上更清楚。
有没有办法使用类成员constexpr函数来初始化成员constexpr变量?
w.r.t。那些DR,不。你可以把它移到外面或者转移到另一个班级。
答案 1 :(得分:0)
感谢Danh。我查看了你告诉的WG线程,毕竟,如果我把它作为一个类模板,我发现我可以使用成员constexpr函数。
// This works (it doesn't if you make it as a non-template class).
template <typename T>
class TemplateFoo
{
public:
constexpr static T Add_InClass(T a, T b) { return a + b; }
constexpr static T kConstantY = Add_InClass(1, 2);
};
// Even such a meaningless template works too.
template <typename T>
class TemplateBar
{
public:
constexpr static int Add_InClass(int a, int b) { return a + b; }
constexpr static int kConstantY = Add_InClass(1, 2);
};
// So, this would be a (dirty but) useful workaround
// when you don't want to use the class as a template.
// Any type could be used as the template argument, which has no meaning.
using Bar = TemplateBar<char>;