@ProCxx

Страница 2373 из 2477
Valentin
24.09.2018
21:22:04
чтобы точно скастило

Anton
24.09.2018
21:22:43
в google coding guidelines вроде написано, не используйте преобразования типов из C++, они все говно ) используйте сишные

если мне не изменяет память

Valentin
24.09.2018
21:23:34
правильно. и void * хорошо.

Google
Anton
24.09.2018
21:24:17
правильно. и void * хорошо.
смотря где и зачем

Valentin
24.09.2018
21:24:33
Use C++-style casts like static_cast<float>(double_value), or brace initialization for conversion of arithmetic types like int64 y = int64{1} << 42. Do not use cast formats like int y = (int)x or int y = int(x) (but the latter is okay when invoking a constructor of a class type).

https://google.github.io/styleguide/cppguide.html раздел Casting.

Anton
24.09.2018
21:25:21
хехе ровно наоборот )

т.е. память таки подвела

либо это новая ревизия

т.к. уже всякая новая херня типа int64{x} есть

аргументы за просто убийственные =)

The problem with C casts is the ambiguity of the operation; sometimes you are doing a conversion (e.g., (int)3.5) and sometimes you are doing a cast (e.g., (int)"hello"). Brace initialization and C++ casts can often help avoid this ambiguity. Additionally, C++ casts are more visible when searching for them.

кстати у них там и cout << теперь рекомендуется вместо printf

засранцы )

Kitsu
24.09.2018
21:30:21
The problem with C casts is the ambiguity of the operation; sometimes you are doing a conversion (e.g., (int)3.5) and sometimes you are doing a cast (e.g., (int)"hello"). Brace initialization and C++ casts can often help avoid this ambiguity. Additionally, C++ casts are more visible when searching for them.
ну сишные касты они же для всего например ты не всегда хочешь убирать const qualifier (иначе на кой хрен он вообще нужен), а сишный каст успешно это делает

Google
Kitsu
24.09.2018
21:31:24
Если более приземленно: (Type1)(obj) - работает по разному, в зависимости от Type1 и obj static_cast/reinterpret_cast/const_cast - явно определяют, что хочется

т.е static_cast<Type1>(obj1) вполне может тебя послать, если не имеет смысла

Anton
24.09.2018
21:32:14
:)

ну это всё какие-то мелочные костылики

и без того 1000 способов выстрелить в ногу есть, если не понимаешь, что делаешь

Kitsu
24.09.2018
21:33:12
явное лучше неявного, мой пусть и небольшой опыт это подтверждает

Anton
24.09.2018
21:33:57
как к этому относится auto?

например auto i = 5; :)

Anton
24.09.2018
21:36:36
fmt::print надо)
это printf в C++22 завезли? ;)

PRoSToC0der
24.09.2018
21:37:53
это printf в C++22 завезли? ;)
fmtlib ещё не приняли в стандарт если правильно помню

Anton
24.09.2018
21:38:30
гыгы

почему не int i = 5;?

не модно?

PRoSToC0der
24.09.2018
21:39:18
почему не int i = 5;?
потому что int i = 5.5; успешно скомпилируется

Anton
24.09.2018
21:39:23
лол

а что в этом плохого?

PRoSToC0der
24.09.2018
21:39:41
можно ещё int i{5};

Google
PRoSToC0der
24.09.2018
21:40:35
или какой-нибудь unsigned int i = -1; тоже скомпилируется

Anton
24.09.2018
21:40:57
а unsigned int i{-1}; не скомпилируется?

Constantine
24.09.2018
21:41:45
Anton
24.09.2018
21:42:34
и правда

зато clang подсказывает как можно всё-таки убедить компилятор что тебе надо выстрелить себе в ногу

1.cc:3:17: error: constant expression evaluates to -1 which cannot be narrowed to type 'unsigned int' [-Wc++11-narrowing] unsigned int i{-1}; ^~ 1.cc:3:17: note: insert an explicit cast to silence this issue unsigned int i{-1}; ^~ static_cast<unsigned int>( )

:D

Constantine
24.09.2018
21:43:11
ой боги, кто придумал стандарт

Anton
24.09.2018
21:43:40
т.е. сферический дурачок в вакууме напишет static_cast<unsigned int>(-1) и будет по-старому

PRoSToC0der
24.09.2018
21:44:01
можно ещё auto i = 5_int;

Constantine
24.09.2018
21:44:16
struct A { explicit A(int) {} }; void foo() { A x{1}; A y = 1; //строже }

PRoSToC0der
24.09.2018
21:44:20
только надо литерал написать

Anton
24.09.2018
21:44:41
кароч всякая такая хуета только затрудняет чтение кода как по мне

а обойти это всё и сделать ошибку всё равно можно

Constantine
24.09.2018
21:45:24
как по мне, я нихуя не понял, почему unsigned int x{-1} строже, чем unsigned int x = -1

почему не наоборот?

Anton
24.09.2018
21:45:44
потому что первый делает проверку

PRoSToC0der
24.09.2018
21:45:45
struct A { explicit A(int) {} }; void foo() { A x{1}; A y = 1; //строже }
второй вариант не будет работать же, т.к. в нём "неявное приведение"

Anton
24.09.2018
21:45:50
дополнительную

Google
Constantine
24.09.2018
21:45:59
потому что первый делает проверку
вопрос почему не второй делает проверку

struct A { explicit A(int) {} }; void foo() { A x{1}; A y = 1; //строже }
почему замена A на unsigned int вообще меняет проверки?

Anton
24.09.2018
21:46:32
потому что раньше считалось что программист думает иногда головой

теперь неочень

Constantine
24.09.2018
21:47:02
так повелось
"так повелось" это эвфемизм для "неудачное техническое решение приняли"?

Anton
24.09.2018
21:47:07
да не

это даже специально сделали

умные дядьки )

Constantine
24.09.2018
21:47:21
специально сделали парадоксальный синтаксис?

Anton
24.09.2018
21:47:40
ну вот в инициализаторы вставили дополнительные проверки

потому что кто-то подумал, что так получше будет )

а компиляторы один хер советуют как эти проверки обойти )

Anton
24.09.2018
21:48:51
ну unsigned int = -1; используется на практике, самое большое число получить, хотя это непереносимый код

Constantine
24.09.2018
21:49:06
это не ответ

почему синтаксис {} не единообразен?

PRoSToC0der
24.09.2018
21:49:54
почему синтаксис {} не единообразен?
ещё раз сформулируй вопрос с примером кода, пожалуйста, я не очень понял тебя

Anton
24.09.2018
21:50:19
всё норм, сделают static_initializer{} и cast_initializer{} в C++30 ;))

Constantine
24.09.2018
21:51:12
struct A { explicit A(int) {} }; //using Z = unsigned int; //#1 //using Z = A; //#2 void foo() { Z x{-1}; Z y = -1; }

Google
Constantine
24.09.2018
21:51:43
в случае #1 первое ошибка, второе ОК

Constantine
24.09.2018
21:51:50
в случае #2 второе ошибка, первое ОК

Anton
24.09.2018
21:53:12
разве не переносимый?
надо смотреть, что там в стандарте

PRoSToC0der
24.09.2018
21:53:30
в случае #2 второе ошибка, первое ОК
в случае #2 второе ошибка, потому что там получается неявный каст, который explicit запрещает первое ОК, потому что как и ожидалось передаётся int, мб ты хотел написать там unsigned int?

PRoSToC0der
24.09.2018
21:54:48
в двух случаях поведение строго противоположно
если explicit A(unsigned int) {} тогда у и первого и второго будет ошибка

Constantine
24.09.2018
21:55:06
PRoSToC0der
24.09.2018
21:56:25
надо смотреть, что там в стандарте
https://stackoverflow.com/questions/4975340/int-to-unsigned-int-conversion

Constantine
24.09.2018
21:56:26
почему-то поведение этих синтаксических конструкций инвертируется в зависимости от фазы луны^W^W вопроса, является ли Z user-defined типом или нет

я понимаю такие правила для драконьего покера)

PRoSToC0der
24.09.2018
21:57:30
почему-то поведение этих синтаксических конструкций инвертируется в зависимости от фазы луны^W^W вопроса, является ли Z user-defined типом или нет
там всё логично (во втором случае), но я так и не понял, почему у тебя в конструкторе аргумент с типом int, а не с типом unsigned int

Constantine
24.09.2018
21:58:11
там всё логично (во втором случае), но я так и не понял, почему у тебя в конструкторе аргумент с типом int, а не с типом unsigned int
логично что? синтаксис Z x{-1} соответствует implicit cast или explicit? синтаксис Z x = -1 соответствует implicit cast или explicit?

PRoSToC0der
24.09.2018
21:58:11
в первом грехи совместимости вполне себе проявляются

Constantine
24.09.2018
21:59:04
Z x{-1} это explicit, Z x = -1 это implicit
тогда почему если Z это unsigned int то первое не компилируется, а второе компилируется?

PRoSToC0der
24.09.2018
21:59:32
Constantine
24.09.2018
21:59:33
преобразование -1 в unsigned int это explicit, не допускающее implicit?

Anton
24.09.2018
21:59:43
https://stackoverflow.com/questions/4975340/int-to-unsigned-int-conversion
там стандарт даже цитируют "If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2^n where n is the number of bits used to represent the unsigned type)." congruent... что бля

))

Страница 2373 из 2477