2012-03-30 8 views
8

ちょうどC + +がキャストに関する警告を表示しないことがわかりましたpair<double, int>からpair<int, int>、少し驚くべきことです。私はそれがg++ test_type.cpp -Wall -Wconversionを使用して、まだ何の警告が生成されないコンパイルキャストペアの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);               
} 

:ここに私のプログラムtest_pair.cppです。私はg ++ v4.6.1を使用しています。誰もがg ++に警告を生成させる方法を知っていますか、それともできませんか?

+1

この表記は何ですかpairはこのような何かを見て、コンストラクタテンプレートを持っていますか?私はそれに慣れていない: 'v.push_back({p});'。 – orlp

+0

申し訳ありませんが、私はC++ 11の機能を使用しようとしていましたが、大括弧を削除する必要があります。 – chtlp

答えて

4

ペア(およびタプル)は、ほぼすべてのものから構築可能です。特に、各要素は暗黙的に変換可能なものから構築できます。基本的には、それは "あなたが期待することをします"。

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では制限を実装できませんでした。 –

+1

v.emplace_back(3.8,3)はまだ警告を生成しません。しかし、説明に感謝します。私は、この陰的なキャスティング機能が少し混乱していると思います。 – chtlp

+1

問題の例の関連するコンストラクタは、実際には 'template のペア(const pair & p); ' – leftaroundabout