gpt4 book ai didi

C++11 - 无法使用 constexpr 函数定义 constexpr 文字?

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:37 24 4
gpt4 key购买 nike

我遇到了一个看似违反直觉的错误,即无法将 constexpr 函数的值分配给 constexpr 文字(希望我正在使用语言正确)。这是示例:

class MyClass {
public:
static constexpr int FooValue(int n) { return n + 5; }
static constexpr int Foo5 = FooValue(5); // compiler error
static constexpr int Foo5Alt(void) { return FooValue(5); } // OK
};

在 GCC 4.8.4 中,Foo5 被标记为 field initializer is not constant。找到this thread暗示旧版本的 GCC 可能是罪魁祸首。所以我把它插入了Coliru (GCC 6.2.0) 并得到错误 'static constexpr int MyClass::FooValue(int)' called in a constant expression before its definition is complete。我添加了 Foo5Alt(),它将其值作为 constexpr 函数而不是字面值返回,并且可以正常编译。

我想我没有理解为什么 FooValue(5) 不能用作 Foo5 的初始值设定项。 FooValue(int n) 的定义是完整的,不是吗? { 返回 n + 5; 是整个定义。 constexpr 表示可以在编译时完全计算的表达式,那么为什么不能用它来定义 constexpr 字面量的返回值呢?

我错过了 C++ 的哪些精妙之处?

最佳答案

在 C++ 中,类成员函数的内联定义仅在类声明完成后才被解析。

因此,即使编译器“知道”MyClass::FooValue(int),它还没有“看到”它的定义,因此它不能在 中使用>constexpr 表达式。

一般的解决方法是坚持使用 constexpr 成员函数,或者在类外声明 constexpr 常量。

关于C++11 - 无法使用 constexpr 函数定义 constexpr 文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46258217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com