Natknąłem się na kłopotliwą sytuację, w której znalazłem oczywistą zwężającą się konwersję, ale jestem rozczarowany, że kompilator (gcc-4.7.2) nie podniósł ostrzeżenia pomimo flag -Wall -Wnarrowing -pedantic
. Proszę zapoznać się z następującym programem:Brak ostrzeżenia o zwężeniu podczas inicjowania za pomocą nawiasów
struct A {
int m;
A(int m) : m(m) {};
};
int main() {
unsigned long v = 0;
A a1(v); // narrowing, but no warning (should this not cause a warning?)
A a2{v}; // narrowing, warning raised (expected)
}
Inicjacja a1
wydaje się latać bez tylu jako peep od kompilatora. Aby upewnić się, że nie szaleję, próbowałem zainicjować a1
w ten sam sposób, ale z nawiasami klamrowymi zamiast parens. Kompilator ostrzega o zwężeniu w drugim przypadku, zgodnie z oczekiwaniami.
Aby było jasne: nie pytam o legalność zawężania konwersji na listach inicjalizacyjnych. Wiem, że to nie jest legalne - inicjowanie kędzierzawe a2
było tylko sprawdzianem zdrowego rozsądku. Moje pytanie nie ma związku z listami inicjalizacyjnymi. To nie jest duplikat pytania.
Czy kompilator nie ostrzega mnie o zwężeniu w celu inicjalizacji a1
?
Konstruktor dla 'a1' może wykonać jedną niejawną konwersję, podczas gdy dla' a2' nie może. Jak myślisz, dlaczego oni powinni być tacy sami? –
Co się stanie, jeśli dodasz flagę '-Wconversion'? –
To nie jest duplikat. Mam już świadomość, że zawężanie konwersji na listach inicjujących jest nielegalne. Pytam o wstępną inicjał z nawiasami. –