【问题标题】:Const method returning non-const reference to vector elementconst 方法返回对向量元素的非常量引用
【发布时间】:2016-12-11 22:26:43
【问题描述】:

我很难弄清楚如何从 const 类方法返回对 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 给出了相同类型的行为,但我无法弄清楚如何让它工作。

【问题讨论】:

  • @jlack 不清楚您为什么要尝试返回对常量对象的非常量引用。
  • 为什么x 是常量?如果你有一个变异访问器,它不应该是 const。
  • 容器中的项目是否应该因为容器是常量而存在争议。如果我有一个包含非常量指针的常量容器,那有根本的不同吗?您可以将 const-ness 视为仅适用于存在的项目,而不适用于它们的值。

标签: c++ vector reference constants const-method


【解决方案1】:

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

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

const T& x() const
{
   return myVec[0];
}
T& x()
{
   return myVec[0];
}

【讨论】:

    【解决方案2】:

    标准库容器将容器的 const-ness 扩展到值本身。由于您的班级在x() 中是不变的,因此向量也是如此。您可以使用 const_cast 从访问器中的项目中删除 const

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多