2012-03-30 8 views
8

Właśnie znalazłem, że C++ nie daje żadnych ostrzeżeń dotyczących przesyłania z pair<double, int> do pair<int, int>, co jest trochę zaskakujące. Oto mój program test_pair.cpp:g ++ opcje ostrzegania dla pary rzutów?

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

skompilować go przy użyciu g++ test_type.cpp -Wall -Wconversion, ale nadal nie ma ostrzeżenia są generowane. Używam g ++ v4.6.1. Ktoś wpadł na pomysł, jak sprawić, by g ++ wygenerowało ostrzeżenie, lub po prostu nie da się tego zrobić?

+1

Co to jest zapis? Nie znam tego: 'v.push_back ({p});'. – orlp

+0

Niestety, próbowałem użyć funkcji C++ 11, powinienem usunąć nawiasy. – chtlp

Odpowiedz

4

Pary (i krotki) można skonstruować z niemal wszystkiego, co pasuje. W szczególności każdy element może być skonstruowany ze wszystkiego, co jest w nim domyślnie wymienialne. Zasadniczo "robi to, czego się spodziewasz". pair szablony konstruktora, który wygląda mniej więcej tak:

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

Jednakże, należy po prostu powiedzieć:

v.emplace_back(3.8, 3); 
+2

+1, ale jest nitpick, mogą być zbudowane z niczego, co jest * niejawnie * wymienialne, a nie tylko wymienialne. To było standardowe sformułowanie przez długi czas (C++ 03, nie jestem pewien co do C++ 98), mimo że w C++ 03 nie można zaimplementować ograniczenia. –

+1

v.emplace_back (3.8, 3) nadal nie generuje żadnych ostrzeżeń. Ale dzięki za wyjaśnienie. Myślę, że ta funkcja niejawnego rzucania może być trochę dezorientująca. – chtlp

+1

Właściwym contructor dla danego przykładu jest w rzeczywistości para 'szablon (stała para & p);' – leftaroundabout