Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++11] Inicjalizacja klamrowa

Ostatnio zmodyfikowano 2014-03-27 19:45
Autor Wiadomość
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
C/C++
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 ?
P-107265
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
P-107266
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.
P-107286
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.
P-107287
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).
P-107295
« 1 »
  Strona 1 z 1