Является ли const в размещении новым лишним? - PullRequest
2 голосов
/ 06 июля 2019

Эта проблема возникла у меня при попытке реализовать контейнер типа std::any.

Является ли использование const в placement new излишним?

Если нет, что это значит?

Должен ли я использовать std::decay на placement new?

#include <iostream>

int
main() {
    auto * address = std::malloc(sizeof(std::string));

    // What does `const` means here?
    // Is it superfluous?
    // Is `std::decay` needed here too?
    new (address) std::string const("hello, world");

    // Is this undefined behaviour?
    // In the context of my code: T -> std::decay<T>
    // Here I'm just using a `std::string` as an example
    auto & str = *static_cast<std::string *>(address);

    str.append("hi");

    std::cout << str << '\n';

    return 0;
}

1 Ответ

2 голосов
/ 06 июля 2019

Это неопределенное поведение, потому что объект - const, и он изменяется на appendтакже может возникнуть проблема с получением указателя на string через значение malloc, а не с использованием результата new: массив не может быть преобразован в указатель с собственным первым элементомне говоря уже об объекте, для которого он предоставляет хранилище (который сам по себе является только термином C ++ 17; это область активных исследований , если не хватает лучшего термина).

...