使用constexpr成员函数初始化constexpr成员变量

时间:2016-12-17 05:19:46

标签: c++ c++11 constexpr

我想使用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

2 个答案:

答案 0 :(得分:1)

来自CWG-1255CWG-1626

  

标准应该明确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>;