
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

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

Anton
24.09.2018
21:30:52

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; :)

PRoSToC0der
24.09.2018
21:36:13

Anton
24.09.2018
21:36:36

PRoSToC0der
24.09.2018
21:37:53

Anton
24.09.2018
21:38:30
гыгы
почему не int i = 5;?
не модно?

PRoSToC0der
24.09.2018
21:39:18

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

PRoSToC0der
24.09.2018
21:41:59

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

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

Google

Constantine
24.09.2018
21:45:59

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
ну вот в инициализаторы вставили дополнительные проверки
потому что кто-то подумал, что так получше будет )
а компиляторы один хер советуют как эти проверки обойти )

Constantine
24.09.2018
21:48:20

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 первое ошибка, второе ОК

PRoSToC0der
24.09.2018
21:51:46

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?

Constantine
24.09.2018
21:53:58
чего вообще непонятного? почему это плохо?

PRoSToC0der
24.09.2018
21:54:48

Constantine
24.09.2018
21:55:06

PRoSToC0der
24.09.2018
21:56:25

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

PRoSToC0der
24.09.2018
21:57:30

Constantine
24.09.2018
21:58:11

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

Constantine
24.09.2018
21:59:04

Evgeniy
24.09.2018
21:59:26

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
))