2013-03-08 12 views
5

g++ z -std=c++11 wydaje się to zaakceptować:Dlaczego w kodzie nie występuje konwersja zawężająca, co powoduje błąd?

#include <vector> 
#include <initializer_list> 

std::vector<float> vf={1,2,3}; // Isn't this narrowing (i.e., an error)? 

int main() {} 

Wydaje się, że linia z komentarzem należy się błędów, ale tak nie jest.

Aktualizacja

Dzięki Jessego dla wskazując na standardese (8.5.4 P7), która określa, dlaczego to jest OK. Oto przykładowy kod, który pomaga wyjaśnić zachowanie określone przez normę:

const int v5=5; 
int v6=6; 

vector<double> vd1={1,2,3,4};  // OK 
vector<double> vd2={1,2,3,4,v5}; // Still OK, v5 is const 
vector<double> vd3={1,2,3,4,v5,v6}; // Error, narrowing conversion, because v6 
            // is non-const 
vector<double> vd4={1,2,3,4,v5,static_cast<const int>(v6)}; // Also errors on 
            // gcc 4.7.2, not sure why. 

Mam nadzieję, że przykłady przedstawione zostaną po prostu pomóc innym ominąć niektórych kwestiach zwężające przy użyciu list initializer.

Jeśli ktoś wie, dlaczego ostatni przypadek narusza standardową definicję, proszę napisać komentarz.

+0

Dlaczego uważasz, że to zwężenie? –

+3

Zwężenie będzie pochodzić od 'float' do' int' –

+0

Jak to się zmniejsza nawrócenie? GCC robi [wystaw ostrzeżenie] (http://liveworkspace.org/code/1FWK1L$2) po wykryciu zwężenia i możesz zamienić to w błąd przez [kompilowanie z '-pedantic-errors'] (http: // liveworkspace.org/code/1FWK1L$1). – Praetorian

Odpowiedz

10

Zasady są w 8.5.4 P7 co wyklucza swój przykład

od typu całkowitej lub unscoped typu wyliczenia do zmiennoprzecinkowym typu, wyjątkiem przypadku, gdy źródłem jest stała ekspresja i wartość rzeczywista po konwersji pasuje do docelowego Ty pe i będzie produkować oryginalną wartość po przekonwertowaniu z powrotem na oryginalny typ, lub & hellip;

(Kopalnia nacisk)

+0

Dobre znalezisko i podziękowania za referencje. Nie wiedziałem, że wyrażenia stałe są traktowane inaczej. –

+0

+1 innymi słowy, nie może być żadnej utraty informacji –

+0

Dowolny pomysł, dlaczego mój ostatni przykład powoduje błąd zwężenia? –

7

Nie widzę powodu, dla którego powinien wystąpić błąd, biorąc pod uwagę, że wszystkie trzy liczby całkowite mogą być dokładnie reprezentowane jako float.

Powiedział, że mogę dostać g++ dać mi ostrzeżenie, jeśli zawierają stałą, które nie mieszczą się w float:

warning: narrowing conversion of '2112112112' from 'int' to 'float' inside { } [-Wnarrowing] 
Powiązane problemy