2013-12-09 157 views
1

看起來std::pair<int, int>可以從const std::pair<int, float>&使用來自here的第4個定義隱式構造。爲什麼std :: pair <int, int>可以從const std :: pair <int, float>&?

#include <iostream> 
#include <vector> 
#include <utility> 

int main() { 
    std::vector<std::pair<int, float>> v = { {1, 1.5f} }; 

    // The interesting line: 
    const std::pair<int, int>& x = v[0]; 

    const auto& y = v[0]; 

    std::cout << "before:\n"; 
    std::cout << "\tv[0]: " << std::get<1>(v[0]) << "\n"; 
    std::cout << "\tx: " << std::get<1>(x) << "\n"; 
    std::cout << "\ty: " << std::get<1>(y) << "\n"; 

    std::get<1>(v[0]) = 3.5f; 

    std::cout << "\nafter:\n"; 
    std::cout << "\tv[0]: " << std::get<1>(v[0]) << "\n"; 
    std::cout << "\tx: " << std::get<1>(x) << "\n"; 
    std::cout << "\ty: " << std::get<1>(y) << "\n"; 
} 

輸出是

before: 
    v[0]: 1.5 
    x: 1 
    y: 1.5 

after: 
    v[0]: 3.5 
    x: 1 
    y: 3.5 

ideone link

似乎感到困難x 「感覺」 不太喜歡比y參考(因爲它是(合法)一個以參考什麼從用戶的角度來看可能是「錯誤」的東西)。

該構造函數不是標記的基本原理是什麼編號explicit? (我假設有一個重要的使用情況。)

+0

我會注意到未來:std :: tuple有一個類似的構造函數。 –

+1

@Dave:爲什麼'explicit'沒有什麼區別?在我看來,它應該,並且轉換爲臨時綁定到const引用是一個隱式轉換。例如http://ideone.com/k6qd6l –

+0

根據SteveJessop的評論,我沒有標記Dave的答案。 –

回答

3
// The interesting line: 
const std::pair<int, int>& x = v[0]; 

該代碼等同於:

const std::pair<int,int>& x = std::pair<int,int>(v[0]); 

那你吃驚的是,由於從std::pair<int,float>std::pair<int,int>轉換存在的編譯器是允許的(和所需的)問題創建臨時的並將const引用綁定到那個。如果您刪除const(並且您沒有使用VS),則代碼應該失敗。

+0

當然,這是我對所發生的事情的理解/猜測,我很好奇的是該構造函數存在的「爲什麼」,或者爲什麼它沒有被明確標記。 –

+1

@JacobParker:該構造函數旨在提供元素明智的轉換,並且應該只參與重載解析,如果兩個成員都是元素明智地隱式轉換的(在C++ 11中,在C++ 03中,該標準說明了某些不同的內容,但它是不可能實現的,所以它做了明確的轉換)。我想這個想法是,如果元素是可轉換的,爲什麼不讓類型轉換?還要注意,這通常與標準庫一起使用:'std :: map ().insert(std :: make_pair(1,2))'使用完全相同的轉換['value_type'是'std :: pair < const int,int>'] –

+0

@ david-rodriguez-dribeas啊,std :: map :: insert例子很好。謝謝。 –

3

x不是v[0]的引用,它是到std::pair<int, int>類型的對象,其中x壽命相匹配的參考。初始化const T&時,如果無法直接引用,則將從右側構建新對象。

在這種情況下,你寫什麼將是相同的文字:

const std::pair<int, int> x = v[0]; // note: no reference 

你或許應該得到一個警告,關於這一點,因爲浮子爲int的轉換。

相關問題