2017-09-22 13 views
3

簡単にするために、コードの一部を渡すだけです。constベクトル参照のオーバーロード

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メソッドが含まれます。

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

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

は何ですか: はそれが私は、次のスニペット

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 

かさえ私が作成した関数を使用してどのように動作するかを理解したいですpuもしそれらが関与していなければ、オーバーロードされたconstメソッドの呼び出し。

私は間違って何をしていますか、どのように私はconstメソッドを含むことができます。 myAので

+1

constへの参照がconst *の場合、constメソッドが呼び出されます。 –

答えて

8

自体constないが、オーバーロード解決は、非const過負荷に有利であろう。

それは私が恐れている人生です。

あなたがconstバージョンをしたい場合、あなたは、呼び出し元のサイト、あるいは暗黙のキャストでconst_castを使用することができconst型にmyAをキャストする:

const A& myA_const = myA; 

、あなたがconstを配置したい場所をmyA_constを使用オーバーロードを呼び出す。

+1

私は答えが遅すぎますが、私は[ideone](https://ideone.com/3fmemE)で準備したMCVEを追加することができます。 – Scheff

+2

@Scheff:なぜあなたは遅すぎると思う?あなたはそのリンクで答えると、私はupvoteします。選択肢が複数ある場合は、SOが最も効果的です。 – Bathsheba

5

私はOPのコードの断片を取り、Bathshebaが記述する内容を示しMCVE製:

#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; 
} 

出力:ideoneでテスト

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

を。

関連する問題