Size: a a a

2020 October 11

KA

Kirill 🍥 Andriyanov... in pro.cxx
именно, спасибо
источник

b

basiliscos in pro.cxx
/rules@GBReborn_bot
источник

b

basiliscos in pro.cxx
#chatlist
источник

A

Arelav in pro.cxx
Andrei K
Это точно неверно.
Почему? Ну то есть идейно кажется этот вариант идёт из двух статик кастов и непонятно почему так нельзя делать
источник

A

Arelav in pro.cxx
Тот же вопрос видимо
источник

DV

Denis Vorkozhokov in pro.cxx
Andrei K
Первый реинтерпрет к поинтеру, затем разыменование, затем второй статик void* к T*
Ты предлагаешь так?
static_cast<T*>(*reinterpret_cast<void**>(&storage))
источник

AK

Andrei K in pro.cxx
Потому что void* это такой сишный способ делать type erasure. Type-safe статический даункаст делается через static_cast от void*
источник

AK

Andrei K in pro.cxx
Reinterpret_cast в простых случаях ничего не испортит, но если T сложный какой-нибудь тип — это может плохо кончиться.
источник

A

Arelav in pro.cxx
Andrei K
Reinterpret_cast в простых случаях ничего не испортит, но если T сложный какой-нибудь тип — это может плохо кончиться.
А можно пример, ну или какую то строчку из стандарта/cppref/какого-нибудь компилятора, я просто не понимаю почему *static_cast<T**>(static_cast<void*>(...));. сделать нельзя? А если можно то должно быть можно и через один reinterpret
источник

AK

Andrei K in pro.cxx
Два статик каста может и можно.
источник

AK

Andrei K in pro.cxx
Точно неправильно реинтерпрет каст онли.
источник

AK

Andrei K in pro.cxx
Arelav
А можно пример, ну или какую то строчку из стандарта/cppref/какого-нибудь компилятора, я просто не понимаю почему *static_cast<T**>(static_cast<void*>(...));. сделать нельзя? А если можно то должно быть можно и через один reinterpret
источник

A

Abmilion in pro.cxx
На какую ос?
источник

AK

Andrei K in pro.cxx
reinterpret_cast ничего не знает про наследование, и не понимает как сдвигать значение указателя.
источник

AK

Andrei K in pro.cxx
Denis Vorkozhokov
Ты предлагаешь так?
static_cast<T*>(*reinterpret_cast<void**>(&storage))
Да, типа того. Если я правильно понял вопрос топикстартера. (По модулю константности конечно)
источник

DV

Denis Vorkozhokov in pro.cxx
Andrei K
reinterpret_cast ничего не знает про наследование, и не понимает как сдвигать значение указателя.
Так, а что там сдвигать то, если у нас каст к T** от aligned_storage_t*
источник

AK

Andrei K in pro.cxx
Denis Vorkozhokov
Так, а что там сдвигать то, если у нас каст к T** от aligned_storage_t*
То что можно писать идеологически неправильный код, который тем не менее будет работать — не значит, что так надо делать.
источник

AK

Andrei K in pro.cxx
Универсальное правило, делать статический даункаст через static_cast.
источник

AK

Andrei K in pro.cxx
На остальное пофиг.
источник

A

Arelav in pro.cxx
Andrei K
Два статик каста может и можно.
Если можно как написано выше, то можно и reinterpret https://en.cppreference.com/w/cpp/language/reinterpret_cast пункт 5, правда насчёт разыменования вопрос
источник