gpt4 book ai didi

c++ - 静态成员声明为 const 但初始化为 constexpr

转载 作者:行者123 更新时间:2023-12-02 14:14:04 24 4
gpt4 key购买 nike

考虑一个具有常量成员的类:

class foo {
public:
const static int N;
};

foo::N 需要初始化:

constexpr int foo::N = 5;

并注意这里使用 constexpr 限定符而不是 const 似乎是一个错误。

但是 GCC、Clang 和 MSVC 都可以正常编译!

  • 语言中是否有允许更改限定符的内容?
  • 这是否是所有三个编译器都忽略的错误?
<小时/>

Clang 甚至允许同时使用两个限定符版本:

constexpr int foo::N = 3;
const int foo::N = 5;

int main(){
return foo::N; //returns 3
}

发生什么事了?

最佳答案

由于显然已声明但 undefined variable 值不能在常量表达式中使用,因此 constexpr 仅适用于变量的定义。 (当然,如果变量是内联的,可能是因为它是声明为 constexpr 的静态成员,每个 定义都必须具有 constexpr。) const (就变量本身而言:constexpr char*char *const,而不是 const char*),所以您尚未更改变量的类型。这与

没有什么不同
// foo.hpp
extern const int x;

// foo.cpp
constexpr int x=2;

这也许不那么令人惊讶。

所以一切都很好!变量的值只能在包含定义的翻译单元中用于常量表达式,但这并不奇怪,并且可以很容易地被解释为模块化的功能。 Clang 允许两个定义是有问题的:大概它试图忽略类中定义的 constexpr 静态数据成员的(从 C++17 开始已弃用)类外定义。

关于c++ - 静态成员声明为 const 但初始化为 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537258/

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