繁体   English   中英

从 constexpr 成员 function 访问非常量数据成员

[英]Accessing non-const data members from constexpr member function

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 function 中的值:

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
};

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

constexpr int test() {
    Foo f{};

    f.set_val(2);

    return f.get_val();
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM