c++ - 从一个新的位置访问一个静态 constexpr 成员是一个常量表达式吗?

标签 c++ language-lawyer static-members placement-new constant-expression

澄清一下,以下程序格式是否正确?

#include <new>
char foo[32];
struct bar {
        static constexpr int foobar = 42;
};

int main() 
{
        auto p = new (foo) bar();
        static_assert(p->foobar == 42);
}
gccmsvc接受,但 clang因错误而拒绝read of non-constexpr variable 'p' is not allowed in a constant expression ,谁是对的?

最佳答案

如果将其更改为:

auto constexpr p = new (foo) bar();
然后 clang 错误信息变得更清晰:
<source>:12:24: error: constexpr variable 'p' must be initialized by a constant expression
        auto constexpr p = new (foo) bar();
                       ^   ~~~~~~~~~~~~~~~
<source>:12:28: note: dynamic memory allocation is not permitted in constant expressions until C++20
        auto constexpr p = new (foo) bar();
                           ^
所以答案取决于 C++ 语言版本。

关于c++ - 从一个新的位置访问一个静态 constexpr 成员是一个常量表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68248117/

相关文章:

c++ - 通过静态成员函数在 C++ 中初始化非常量静态成员变量

c++ - 用于确定机器字节顺序的条件预处理器指令

c# - 如果函数中的字段是静态的,则将函数声明为静态或非静态会有什么不同吗?

c++ - 节点句柄与 std::unique_ptr

c++11 - 使用与 typedef - 是否存在微妙的、鲜为人知的区别?

c++ - 非静态成员函数的 std::add_pointer 实现

c++ - C++ 标准是否要求 C 链接函数为 `noexcept` ?

java - 多个实例与单个静态实例

c++ - C++-如何计算比较程序在二进制树中查找值所花费的次数

c++ - 从文件中读取字符串到数组