2012-03-30 103 views
8

我剛剛發現C++沒有給出從pair<double, int>pair<int, int>的投射警告,這有點令人驚訝。下面是我的程序test_pair.cpp鑄造對的g ++警告選項?

#include <vector> 
#include <utility> 
using namespace std; 


int main() 
{ 
    std::vector<pair<int, int> > v; 
    pair<double, int> p = make_pair(3.8, 3); 
    v.push_back(p);               
} 

我把它用g++ test_type.cpp -Wall -Wconversion,但仍產生任何警告編譯。我正在使用g ++ v4.6.1。任何人都知道如何讓g ++爲此產生警告,或者它不能完成?

+1

這是什麼符號?我不熟悉它:'v.push_back({p});'。 – orlp 2012-03-30 11:51:19

+0

對不起,我試圖使用C++ 11功能,我應該刪除括號。 – chtlp 2012-03-30 11:52:05

回答

4

對(和元組)可以從幾乎任何適合的東西中構造出來。特別是,每個元素都可以由任何可以隱式轉換的元素構建。基本上,它「符合你的期望」。該pair有看起來像這樣的構造函數模板:

template <typename U, typename V> 
pair(U && u, V && v) : first(std::forward<U>(u)), second(std::forward<V>(v)) 
{ } 

但是,你應該說:

v.emplace_back(3.8, 3); 
+2

+1,但有一個挑剔的問題,它們可以由任何隱含*可轉換的東西構成,而不僅僅是可轉換的。這已經是很長一段時間的標準措辭(C++ 03,不確定C++ 98),即使使用C++ 03,限制也無法實現。 – 2012-03-30 11:56:33

+1

v.emplace_back(3.8,3)仍不會產生任何警告。但謝謝你的解釋。我認爲這種隱含的轉換特性可能有點令人困惑。 – chtlp 2012-03-30 12:01:14

+1

這個例子的相關構造函數實際上是'template pair(const對 & p);' – leftaroundabout 2012-03-30 12:01:57