constexpr 类中的引用字段

Reference fields in constexpr class

本文关键字:引用 字段 constexpr      更新时间:2023-10-16

>编辑:我能够完全最小化这个问题,感谢您的反馈。

现在,我正在研究一个向量类(向量它是数学中的术语(。此类具有维度和元素类型的模板。我需要定义引用字段:X,Y,语法必须不需要调用括号(v.X() - incorrect solution(。我对此的实现:

#include <array>
template <typename Ty, size_t Size>
struct vector {
std::array<Ty, Size> data;
Ty& x{ this->data[0] };
Ty& y{ this->data[1] };
};
constexpr vector<int, 2> const_context() {
vector<int, 2> v1{ 1,2 };
v1.data[0] = 1;
return v1;
}
int main() {
constexpr auto res = const_context();
}

如果我们注释 x 和 y 字段编译它是成功的。

我的乐器:Visual Studio 2017 和 C++ 17。解决方案必须是可移植的,并且不依赖于编译器。

您的问题可以简化为:

#include <array>
struct X
{
constexpr X() = default;
std::array<int, 2> data{};
int& x { this->data[0]};
};

int main()
{
constexpr auto res = X{};
}
<source>:14:20: error: constexpr variable 'res' must be initialized by a constant expression
constexpr auto res = X{};
^     ~~~
<source>:14:20: note: reference to subobject of 'res' is not a constant expression
<source>:14:20: note: declared here

问题是 constexpr 引用只能绑定到具有静态存储持续时间的对象(this不是(。了解如何初始化 constexpr 引用

因此,如果不使其成为方法(x()语法(,就不可能实现。