Любая полезная разница между std::bit_cast и std::start_lifetime_as?

std::bit_cast, по-видимому, вводится в С++ 20. и std::start_lifetime_as предлагается для c++23 (из P0593R5). Поскольку они оба требуют, чтобы задействованные типы данных в любом случае были тривиальными, будет ли необходимость в первом после введения последнего?

Заранее приносим извинения за то, что не предоставили больше информации об этих новых функциях. Я только что услышал о них после просмотра лекции cppcon 2019 о каламбурах, и мне не удалось найти много о start_lifetime_as в Google. Я надеюсь, что кто-то еще, кто видит это, может знать больше.


person markt1964    schedule 06.10.2019    source источник
comment
Вы имеете в виду, помимо того факта, что один из них существует как полностью принятая часть рабочего проекта С++ 20, в то время как другой является предложением, которое находится в постоянном движении, не принято как часть какого-либо стандарта и, следовательно, никогда не может быть стандартом ?   -  person Nicol Bolas    schedule 06.10.2019
comment
@NicolBolas start_lifetime_as предлагается для С++ 23, на самом деле.   -  person markt1964    schedule 06.10.2019
comment
@NicolBolas Добавил ссылку на него.   -  person Barry    schedule 14.10.2019


Ответы (2)


Ответ тривиален: bit_cast возвращает значение, тогда как start_lifetime_as «изменяет» память (таким образом, который существует в абстрактной машине, но не должен влиять на какие-либо физические биты). Вы используете первый, чтобы (один раз) интерпретировать существующий объект как набор битов; вы используете последний для (постоянной) интерпретации существующих битов как объекта.

person Davis Herring    schedule 06.10.2019

std::bit_cast копирует биты своего аргумента в новое значение другого типа.

float myFloat = 3.14;
auto asUint = std::bit_cast<uint32_t>(myFloat);
auto asBytes = std::bit_cast<std::array<char,4>>(myFloat);

myFloat, asUint и asBytes — это отдельные переменные с отдельными адресами. Компилятор может полностью оптимизировать некоторые из них, но логически это совершенно разные значения, которые просто имеют одинаковый размер и биты.

std::start_lifetime_as ничего не делает. Он просто сообщает компилятору, что он может обрабатывать диапазон памяти, как если бы он содержал массив указанного типа. Затем это позволяет разработчику использовать эту память как массив, не вызывая неопределенного поведения. Он физически не изменяет переданную ему память и ничего не возвращает. Это чисто для учета объектной модели С++.

person Parker Coates    schedule 11.10.2019