2012-03-30 18 views
8

Acabo de encontrar que C++ no da ninguna advertencia para el lanzamiento desde pair<double, int> hasta pair<int, int>, lo cual es un poco sorprendente. Aquí está mi programa test_pair.cpp:g ++ ¿opciones de advertencia para el par de lanzamiento?

#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, pero todavía no se generan advertencias. Estoy usando g ++ v4.6.1. Alguien tiene alguna idea de cómo hacer que g ++ genere una advertencia para esto, o simplemente no se puede hacer?

+1

¿Cuál es esta notación? No estoy familiarizado con esto: 'v.push_back ({p});'. – orlp

+0

lo siento, estaba tratando de usar las características de C++ 11, debo eliminar los corchetes. – chtlp

Respuesta

4

Los pares (y las tuplas) son construibles a partir de casi cualquier cosa que quepa. En particular, cada elemento se puede construir a partir de cualquier elemento que sea implícitamente convertible a él. Básicamente, "hace lo que esperas". El pair tiene plantillas constructor que ser algo como esto:

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

Sin embargo, sólo debe decir:

v.emplace_back(3.8, 3); 
+2

+1, pero hay un nitpick, se pueden construir a partir de cualquier cosa * implícitamente * convertible, no solo convertible. Esa ha sido la redacción estándar durante mucho tiempo (C++ 03, no estoy seguro acerca de C++ 98), aunque con C++ 03 la restricción no pudo implementarse. –

+1

v.emplace_back (3.8, 3) aún no genera ninguna advertencia. Pero gracias por la explicación. Creo que esta característica de conversión implícita puede ser un poco confusa. – chtlp

+1

El contructor relevante para el ejemplo en cuestión es en realidad 'plantilla par (const par & p);' – leftaroundabout

Cuestiones relacionadas