+2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
// https://habr.com/ru/company/jugru/blog/469465/
// Инициализация в современном C++
// ...
//Есть примеры ещё более странного поведения этого синтаксиса:
std::string s(48, 'a'); // "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
std::string s{48, 'a'}; // "0a"
> В первой строке создаётся строка из 48 символов «а», а во второй строка «0а». Это происходит потому, что конструктор string принимает на вход initializer_list из символов. 48 является целочисленным значением, поэтому оно преобразуется в символ. В ASCII число 48 — код символа «0». Это очень странно, потому что есть конструктор, принимающий именно такие аргументы, int и char. Но вместо вызова этого конструктора происходит совершенно неочевидное преобразование. В итоге получается код, который чаще всего ведёт себя не так, как мы ожидаем.
КАК? Как можно было столько хуйни наворотить для такой простой вещи, как инициализация переменной? Чем они вообще думают?
Не перестаю удивляться долбоебизму крестостандартизаторов
Запостил:
j123123,
05 Октября 2019
Вот это вот, ИМХО, один из самых каких багров. Именно поэтому я за «def», «function», «defun», «fun», «func» и иже с ними.
>> И экран у него был 80 чаров шириной.
Поэтому «def», «function», «defun», «fun», «func» — непозволительная роскошь. Сишники ведь до сих пор набирают программы на пассивном терминале, подключенном длинной «лапшой» к мейнфрейму.
В первом случае ты вызвал нужный конструктор.
Во втором - конструктор от initializer_list<int>.
https://metacpan.org/pod/distribution/POD2-RU/lib/POD2/RU/perlsecret.pod
http://pragmaticperl.com/issues/06/pragmaticperl-06-секретные-операторы-perl-и-не-только.html
> Это очень странно, потому что есть конструктор, принимающий именно такие аргументы, int и char. Но вместо вызова этого конструктора происходит совершенно неочевидное преобразование.