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

Posted

技术标签:

【中文标题】使用 constexpr 成员函数初始化 constexpr 成员变量【英文标题】:Initialization of constexpr member variable using constexpr member function [duplicate] 【发布时间】:2016-12-17 05:19:45 【问题描述】:

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

【问题讨论】:

open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1626 【参考方案1】:

来自CWG-1255 和CWG-1626

标准应该明确指出,constexpr 成员函数在其类完成之前不能在常量表达式中使用。

您的代码似乎是故意不可接受的。但是,标准应该更清楚地说明这一点。

有没有办法使用类成员constexpr函数来初始化成员constexpr变量?

w.r.t.那些 DR,不。你可以把它移到外面或另一个班级。

【讨论】:

【参考方案2】:

感谢丹。我查看了您告诉的 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>;

【讨论】:

请记住,当 DR 已修复时。模板也将被禁止

以上是关于使用 constexpr 成员函数初始化 constexpr 成员变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 constexpr 静态成员函数在调用时不被视为 constexpr?

如何初始化std :: vector的静态constexpr成员 在c ++ 11中?

当值是非常量但使用常量表达式初始化时使用 constexpr?

c++ 默认构造函数 constexpr 还是正确未定义?

constexpr

如何编写工厂函数来初始化 C++ 中的 constexpr 引用?