2012-03-30 10 views
8

Ho appena scoperto che C++ non fornisce alcun avviso per il cast da pair<double, int> a pair<int, int>, il che è un po 'sorprendente. Qui è il mio programma test_pair.cpp:Opzioni di avviso g ++ per la coppia di casting?

#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);               
} 

compilo usando g++ test_type.cpp -Wall -Wconversion, ma ancora nessun avviso vengono generati. Sto usando g ++ v4.6.1. Qualcuno ha idea di come rendere g ++ generare un avviso per questo, o semplicemente non può essere fatto?

+1

Che cosa è questa notazione? Non mi è familiare: 'v.push_back ({p});'. – orlp

+0

scusate, stavo cercando di usare le funzionalità di C++ 11, dovrei rimuovere le parentesi. – chtlp

risposta

4

Coppie (e tuple) sono costruibili da quasi tutto ciò che si adatta. In particolare, ogni elemento può essere costruito da tutto ciò che è implicitamente convertibile ad esso. Fondamentalmente, "fa quello che ti aspetti". Il pair dispone di modelli costruttore che simile a questa:

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

Tuttavia, si dovrebbe solo dire:

v.emplace_back(3.8, 3); 
+2

+1, ma c'è un nitpick, possono essere costruiti da tutto ciò che è * implicitamente * convertibile, non solo convertibile. Questa è stata la formulazione standard per un lungo periodo (C++ 03, non sono sicuro di C++ 98), anche se con C++ 03 non è stato possibile implementare la restrizione. –

+1

v.emplace_back (3.8, 3) continua a non generare alcun avviso. Ma grazie per la spiegazione. Penso che questa caratteristica implicita di casting possa essere un po 'confusa. – chtlp

+1

Il contructor pertinente per l'esempio in questione è in realtà 'modello coppia (coppia const & p);' – leftaroundabout

Problemi correlati