从 constexpr 成员函数访问非常量数据成员
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
函数中改变值:
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
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