[C++11] Inicjalizacja klamrowa
Ostatnio zmodyfikowano 2014-03-27 19:45
MTPR Temat założony przez niniejszego użytkownika |
[C++11] Inicjalizacja klamrowa » 2014-03-26 22:23:07 Witam. W książce którą przerabiam wykorzystywany jest standard C++11, używam Code::Blocks char c { 31000 }; int d[ 4 ] { 100, 200, 5.55, 300 };
Jest to inicjalizacja listą, która zabezpiecza przed zawężaniem typu, kiedy typ zmiennej inicjalizowanej nie pozwala na reprezentowanie wartości inicjalizującej. Czyli taki zapis jest niedozwolony, zmienna char nie zmieści takiej wartości, a w drugiej inicjaliacji wystąpi konwersja typu zmiennoprzecinkowego na całkowity. U mnie jednak taki zapis daje rade, kompilator na nic nie reaguje, dlaczego ? |
|
Monika90 |
» 2014-03-26 22:57:55 Jesteś pewien, że nie reaguje? Może nie włączyłeś trybu C++11? GCC 4.8 produkuje: main.cpp:4:16: warning: narrowing conversion of '31000' from 'int' to 'char' inside { } [-Wnarrowing] char c { 31000 }; ^ main.cpp:4:16: warning: overflow in implicit constant conversion [-Woverflow] main.cpp:5:34: warning: narrowing conversion of '5.5499999999999998e+0' from 'double' to 'int' inside { } [-Wnarrowing] int d[ 4 ] { 100, 200, 5.55, 300 }; ^
co jest reakcją zgodną ze standardem |
|
MTPR Temat założony przez niniejszego użytkownika |
» 2014-03-27 15:52:23 Może źle się wyraziłem, taka reakcja jest, log kompilacji wygląda tak samo jak to pokazałeś/pokazałaś z włączoną odpowiednią opcją dla C++11 jak i bez niej, z książki dowiaduję się, że inicjalizacja listą w C++11 nie pozwala na zawężanie typu, więc w takim przypadku powinien wystąpić błąd kompilacji. Natomiast kończy się tylko ostrzeżeniem. |
|
Monika90 |
» 2014-03-27 17:33:18 Widzisz, koleżanko lub kolego, otóż standard języka C++ w przypadku błędnego programu wymaga od implementacji jedynie komunikatu diagnostycznego (a i to nie zawsze). No i masz komunkat. W przypadku GCC możesz użyć flagi -Werror=narrowing, żeby zmienić warning w error. |
|
MTPR Temat założony przez niniejszego użytkownika |
» 2014-03-27 19:45:00 Skoro tak to w porządku, w książce napotykam się już na 3 paragraf gdzie pisze że taka inicjalizacja jest niedozwolona. Stąd usilnie myślałem że jednak ten błąd kompilacji powinien wystąpić(chodź tego dosłownie nie ma napisane). |
|
« 1 » |