使用 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中?