2017-08-15 68 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 

這將顯得很瑣碎,但是,我想知道爲什麼我不能在這種情況下使用引用的對。謝謝!

+1

只要寫編輯您的問題時,請小心。它可能會使答案(如我的)錯誤。 –

+0

注意到了,併爲此道歉。 – Belfer4

回答

2

隨着

auto pair = getPairRef(); 

可變pair推導出作爲,而不是參考。

你需要明確使它成爲一個參考:

auto& pair = getPairRef(); 
+0

啊是的。我仍然在學習C++ 11,希望這可以幫助像我這樣的其他人。總之,非常感謝! – Belfer4

0

在成員函數modifyRefInternal

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

你能解釋一下decltype在做什麼嗎?另外,我的編譯器不支持這個。這是C++ 11嗎?編輯 - 編譯器抱怨以下內容:'decltype'之前的預期主表達式 – Belfer4

+1

@ Belfer4看起來它是C++ 14功能。 –