常量向量引用重载

3
为了简单起见,只需传递代码的一部分。
class A {
public:
std::vector<int> & get(){ return myVector;}
const std::vector<int> & get() const {return myVector;}
private:
   std::vector<int> myVector;
}

我的问题是如何涉及重载的const get方法。当我尝试创建const_iterator并调试代码时,它涉及非const方法。 为了理解它的工作原理,我使用以下代码片段

A myA;
myA.get().push_back(1);
for (const auto& v: myA.get()) { } // it involve not const get method

或者

std::vector<int>::const_iterator cit = myA.get().begin()
//it involves not const method

或者

 const std::vector< int > v = myA.get( );
 // involves non-const method

甚至我创建一个函数:

int constVector( const std::vector< int > &constVector )
{
   return constVector[0];
}

int b = constVector( myA.get( ) ); // it involves non-const method

如果不涉及重载const方法的作用是什么。

我做错了什么,如何使用const方法。


1
当对A的引用为const时,将调用const方法。 - Richard Hodges
2个回答

8

由于myA本身并不是const,因此重载解析器会倾向于选择非const的重载。

这就是生活,很抱歉。

如果您想使用const版本,则可以在调用站点使用const_cast,甚至是隐式转换,将myA转换为const类型:

const A& myA_const = myA;

在需要调用 const 重载的地方,使用 myA_const


1
我回答晚了,但你可以在ideone上添加我准备的MCVE。 - Scheff's Cat
2
@Scheff:你为什么认为你来晚了?如果有多个答案可供选择,SO的效果最佳。你可以用那个链接回答,我会点赞的。 - Bathsheba

5

我使用OP的代码片段制作了一个MCVE,展示了Bathsheba所描述的内容:

#include <iostream>
#include <vector>

class A {
  public:
    std::vector<int>& get()
    {
      std::cout << "A::get()" << std::endl;
      return myVector;
    }
    const std::vector<int>& get() const
    {
      std::cout << "A::get() const" << std::endl;
      return myVector;
    }

  private:
    std::vector<int> myVector;
};

int main()
{
  A myA;
  myA.get().push_back(1);
  for (const auto& v: myA.get()) { } // it involve not const get method
  // use const reference to instance
  std::cout << "use const reference to instance" << std::endl;
  { const A &myAC = myA;
    for (const auto& v: myAC.get()) { } // it involves const get method
  }
  return 0;
}

输出:

A::get()
A::get()
use const reference to instance
A::get() const

测试于ideone上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接