Неявное создание объекта через границы функции или перевод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

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