2017-08-15 22 views
1

私の質問はとてもシンプルです。答えは見つけられていないので、ここで質問しています。参照std :: pairの値を変更するには?

関数からstd :: pair参照を返すことができるかどうか不思議で、呼び出し関数がその値を変更してもらえるかどうか不思議です。ここで私が何を意味するかの例です:

struct PairStruct { 
    using PairType = std::pair<size_t, size_t>; 

    PairStruct() : m_pair(std::make_pair(0, 0)) {} 

    void modifyRefInternal() { 
     auto pair = getPairRef(); 

     std::cout << "start - first: " << pair.first << ", second: " << pair.second << "\n"; 
     pair.first++; 
     pair.second++; 
     std::cout << "end - first: " << pair.first << ", second: " << pair.second << "\n"; 
    } 

    void modifyPtrInternal() { 
     auto pair = getPairPtr(); 

     std::cout << "start - first: " << pair->first << ", second: " << pair->second << "\n"; 
     pair->first++; 
     pair->second++; 
     std::cout << "end - first: " << pair->first << ", second: " << pair->second << "\n"; 
    } 

    PairType &getPairRef() { 
     return m_pair; 
    } 

    PairType *getPairPtr() { 
     return &m_pair; 
    } 

    PairType m_pair; 
}; 

int main(int argc, char ** args) 
{ 
    PairStruct *pairInst = new PairStruct; 

    // Test with reference 
    std::cout << "Reference test.\n"; 
    pairInst->modifyRefInternal(); 
    std::cout << "\n"; 
    pairInst->modifyRefInternal(); 

    std::cout << "\n"; 

    // Test with ptr 
    std::cout << "Ptr test.\n"; 
    pairInst->modifyPtrInternal(); 
    std::cout << "\n"; 
    pairInst->modifyPtrInternal(); 

    delete pairInst; 
    return 0; 
} 

私はそれが正しく値をmodyfiesポインタを使用する際の基準を返すとき、これはそうではありません期待されるように。ここでは、このプログラムの出力です:

Reference test. 
start - first: 0, second: 0 
end - first: 1, second: 1 

start - first: 0, second: 0 
end - first: 1, second: 1 

Ptr test. 
start - first: 0, second: 0 
end - first: 1, second: 1 

start - first: 1, second: 1 
end - first: 2, second: 2 

これは、しかし、私はこのケースでは、参照ペアを使用できない理由を知りたいのですが、非常に些細なようだとしています。ありがとう!

auto pair = getPairRef(); 

可変pair

+1

を書くには十分ご注意ください。それは答え(私のような)が間違っているかもしれません。 –

+0

注目されて、それについては申し訳ありません。 – Belfer4

答えて

2

なく、基準として推定されます。あなたが明示的に参照するようにする必要があり

:あなたの質問を編集する際

auto& pair = getPairRef(); 
+0

ああ。私はまだC++ 11を学んでいますが、これが私のような誰かに役立つことを願っています。とにかく、ありがとう! – Belfer4

0

ただ、メンバ関数にmodifyRefInternal

decltype(auto) pair = getPairRef(); 
^^^^^^^^^ 
+0

ここで何を宣言しているのか説明できますか?また、私のコンパイラはこれをサポートしていません。これはC++ 11ですか?編集 - コンパイラは次の文句を言っています: 'decltype'の前に期待されるprimary-expression – Belfer4

+1

@ Belfer4 C++ 14の機能のようです。 –

関連する問題