Неявное создание объекта через границы функции или переводC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неявное создание объекта через границы функции или перевод

Сообщение Anonymous »

Неявное создание объекта определено здесь: https://timsong-cpp.github.io/cppwp/n48 ... .object#10
Список операций, которые запускают, это описано здесь: https://timsong-cpp.github.io/cppwp/n48 ... .object#13
тривиальный пример будет:

Код: Выделить всё

#include  // std::launder

int main() {
unsigned char* storage = new unsigned char[sizeof(float)]; // implicitly creates object
float* pobj = std::launder(reinterpret_cast(storage));
*pobj = 3.14f;
}
Создание Unsigned char Array неявно создает объект. Это поплавок, потому что, если это так, программа «имеет определенное поведение», и они не являются другим набором объектов, которые могут сделать это здесь.

Код: Выделить всё

#include  // std::launder

void foo(unsigned char* storage) {
float* pobj = std::launder(reinterpret_cast(storage));
*pobj = 3.14f;
...
}
< /code>
Предположим, что хранилище не используется в другой функции или TU. Буквально читая стандарт, это все еще хорошо определен, но как компилятор может «знать», потому что он не может видеть точку создания. Стандарт тогда просто говорит, что если есть другая функция: < /p>
#include  // std::launder
#include  // std::uint32_t

void bar(unsigned char* storage) {
std::uint32_t* pobj = std::launder(reinterpret_cast(storage));
*pobj = 42;
...
}
< /code>
Компилятор должен будет сделать то же предположение, что и выше, на этот раз для объекта std :: uint32_t < /code>.
Но тогда не дано никакой гарантии на следующем выходе программы, это неопределенное поведение. < /p>
int main() {
unsigned char* storage = new unsigned char[sizeof(float)];
foo(storage);
bar(storage);
delete [] storage;
}
Является ли моя интерпретация стандартной правильной?


Подробнее здесь: https://stackoverflow.com/questions/797 ... boundaries
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»