gpt4 book ai didi

c++ - 静态 constexpr 函数不同于全局?

转载 作者:搜寻专家 更新时间:2023-10-31 01:03:49 27 4
gpt4 key购买 nike

我无法理解为什么静态 constexpr 的行为与全局 constexpr 不同。我究竟做错了什么?编译器错误不是特别有用:

prog.cpp:20:17: error: ‘static constexpr int Bar::foo(const char*)’ called in a constant expression
B = Bar::foo(s)
^
prog.cpp:20:17: error: enumerator value for ‘B’ is not an integer constant

代码如下:

#include <iostream>

constexpr int foo(const char* v)
{
return v[0];
}

struct Bar
{
static constexpr int foo(const char* v)
{
return v[0];
}

static constexpr const char* s = "abc";

enum
{
A = ::foo(s),
B = Bar::foo(s)
};
};

int main()
{
int a[Bar::A];
a[0] = Bar::A;
}

最佳答案

这是因为 enum 是类声明的一部分,而类内部函数的定义在逻辑上被推迟到类声明之后。这意味着就 enum 而言,它看不到 B::foo 的定义,因此它不能调用它作为一个常量表达式。您可以通过将 enum 放在类后面来看到这一点:

#include <iostream>

constexpr int foo(const char* v)
{
return v[0];
}

struct Bar
{
static constexpr int foo(const char* v)
{
return v[0];
}

static constexpr const char* s = "abc";
};

enum Enum
{
A = ::foo(Bar::s),
B = Bar::foo(Bar::s)
};

没有错误。

关于c++ - 静态 constexpr 函数不同于全局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184409/

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