constexpr 类中的引用字段
Reference fields in constexpr class
>编辑:我能够完全最小化这个问题,感谢您的反馈。
现在,我正在研究一个向量类(向量它是数学中的术语(。此类具有维度和元素类型的模板。我需要定义引用字段: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()
语法(,就不可能实现。
相关文章:
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- 对象引用中的字段以不同的方法返回不同的值
- 将字段(在类中)定义为引用的缺点是什么?
- 为什么在具有引用字段的类中隐式删除复制运算符
- 通用引用和压缩字段
- C++ Arduino:向下转换后,子字段不引用原始地址
- 如何匹配通过引用传递给模拟函数的结构字段
- Const 引用字段作为类中的只读属性C++
- 正在取消引用自定义结构字段的迭代器
- 作为对象字段的右值引用
- C++:为智能指针的字段隐式保留右值引用
- 来自 gcc 原子标头的对我的类静态字段错误的未定义引用
- 为什么我无法返回对打包字段的引用?
- 如何使用 GNU C++引用继承类的字段
- 使用 std::vector、boost::variant 和带有引用字段的类型
- 引用其他对象作为引用类字段
- 是否声明抽象类型的字段?首选指针或引用
- "Undefined reference"尝试引用静态字段
- 无法引用非静态字段"x"
- 我无法通过类 Artist 的公共方法修改任何私有字段。我尝试在函数名称之前添加引用(&),但崩溃了