gpt4 book ai didi

c++ - 在 volatile 成员中使用 constexpr/static 函数的 C++ 中是否有任何警告?

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

我需要在我的类中有 volatile 成员函数(这是微不足道的并且具有标准布局),以便可以将类实例声明为 volatile(需要用于内存映射寄存器访问)。
但是,我发现 GCC 并不愿意从 volatile 成员中调用静态 constexpr 函数。铿锵是很好的。
这是简化的代码示例:
https://gcc.godbolt.org/z/36rE7h

#include <cstddef>
#include <cstdint>

class B {
public:
static constexpr uint32_t genMask()
{
return 0xFF;
}

uint32_t get(size_t word) const volatile
{
constexpr uint32_t mask = genMask();

return data[word] & mask;
}
private:
uint32_t data[5];
};

uint32_t fun()
{
constexpr uint32_t my_mmio_reg_addr = 0x8000BEEF;
volatile B *b = new (reinterpret_cast<uint32_t *>(my_mmio_reg_addr)) B;

return b->get(0);
}
海合会提示
In member function 'uint32_t B::get(size_t) const volatile':

13:43: error: 'this' is not a constant expression
13 | constexpr uint32_t mask = genMask();
| ^
如果我改变
constexpr uint32_t mask = genMask();
constexpr volatile uint32_t mask = genMask();
GCC 可以很好地编译代码,但随后它将掩码视为 volatile ,总是重新读取它的值,从而导致非最佳代码。
为什么 volatile 成员说明符会影响本地 constexpr 变量和静态 constexpr 成员函数?它是 GCC 中的错误还是 C++ 规范的某些阴暗面?
为什么 *this如果只涉及局部变量和静态成员函数,这里会以某种方式参与吗?

最佳答案

原来是已知的 GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80456
根据我的测试,问题首次出现在 GCC 4.9 中,并且从 GCC 10.2 开始没有修复。
不幸的是,在后备箱中也没有修复它。

关于c++ - 在 volatile 成员中使用 constexpr/static 函数的 C++ 中是否有任何警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64019728/

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