c++ - 从 constexpr 成员函数访问非常量数据成员

标签 c++ gcc visual-c++ constexpr

GCC 和 MSVC 似乎都允许为非常量数据成员定义 constexpr 访问器函数:

#include <random>
#include <iostream>

class Foo
{
    int val;

public:
    Foo(int v) : val(v) {}

    constexpr int get_val() { return val; } // OK
};

int main()
{
    std::random_device rd;
    Foo foo((int)rd());
    std::cout << foo.get_val(); // works
}

这是 MSVC 和 GCC 的非标准行为还是标准实际上允许这样做?

最佳答案

这当然是允许的! constexpr 并不意味着const。您甚至可以改变 constexpr 函数中的值:

class Foo
{
    int val;

public:
    constexpr Foo(int v) : val(v) {} // OK

    constexpr int get_val() { return val; } // OK
    constexpr void set_val(int v) { val = v; } // OK
};

有了这个,你可以编写看起来像普通函数的 constexpr 函数,只是它们可能在编译器运行时的编译时执行。

constexpr int test() {
    Foo f{};

    f.set_val(2);

    return f.get_val();
}

static_assert(test() == 2); // Checks at compile time

关于c++ - 从 constexpr 成员函数访问非常量数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70103300/

相关文章:

c++ - 列表初始化中多个模板化构造函数的重载规则

c++ - 设置地址后是否需要删除指针?

c++ - Cocoa 选择器的行为可以用 C++ 重新实现吗?

C++ - 无法实例化抽象类

c++ - Boost::signals2 - 描述带有插槽的对象

android - 使用预编译 header 时 GCC 失败且没有消息

c - C99代码的免费静态检查器

c++ - 编译器如何实现位域运算?

c++ - 如何在 C++/DirectX 和 HLSL 之间共享结构?

c++ - 连续启动线程可能导致内存泄漏?