Const 方法返回对向量元素的非常量引用

Const method returning non-const reference to vector element

我很难弄清楚如何从 const class 方法 return 对 std::vector 中元素的 non-const 引用。我想要的一个简单例子是,

template<class T>
class MyClass
{
 public:
 MyClass : myVec(3)
 {
 }

 T& x() const
 {
    return *(myVec.data())[0]
 }

 std::vector<T> myVec;
}

我想要的行为是我希望能够执行以下操作,

MyClass obj<double>;
obj.x() = 3.3;
assert(obj.x()==3.3)

Eigen 给出了相同类型的行为,但我一直无法弄清楚如何让它工作。

您可以使用 const_cast,它会在这里完成工作(根据张贴的用法)。但是在这种情况下(以及大多数情况下)您不需要它。

您可以(并且应该)为其添加非常量成员函数重载。然后const成员函数returns引用const,non-const成员函数returns引用non-const。将通过 overload resolution.

调用适当的一个
const T& x() const
{
   return myVec[0];
}
T& x()
{
   return myVec[0];
}

标准库容器将容器的常量性扩展到值本身。由于您的 class 在 x() 中是常数,向量也是。您可以使用 const_cast 从访问器中的项目中删除 const

return const_cast <T&> (*(myVec.data())[0]);

一般来说,这被认为是不好的做法,因为 const 是为了保护你。绕过这些保护会使代码更难推理。