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.
Dlaczego uważasz, że to zwężenie? –
Zwężenie będzie pochodzić od 'float' do' int' –
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