Размещение новым в профсоюзе UB для Су?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Размещение новым в профсоюзе UB для Су?

Сообщение Anonymous »

Я пишу упрощенную версию std :: move_only_function в c ++ 11.
В моей реализации я предоставляю оптимизацию небольших объектов (a.k.a Soo) для моего кода, который в основном представляет собой союз, который хранит как указатель функции, так и указатель стира , Я могу использовать новое размещение для хранения обернутого объекта непосредственно в области памяти, где находится объединение, а затем получить к нему доступ p>

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

template
class UniqueFunction;

template
class UniqueFunction {
struct AnyFn {
virtual ~AnyFn() noexcept              = default;
virtual Ret operator()( Args... args ) = 0;
};
template
struct FnContainer : public AnyFn {
Fn fntor_;

FnContainer( Fn fntor ) : fntor_ { std::move( fntor ) } {}

FnContainer( const FnContainer& )              = delete;
FnContainer& operator=( const FnContainer& ) & = delete;
virtual ~FnContainer() noexcept                = default;

Ret operator()( Args... args ) override { return fntor_( std::forward( args )... ); }
};

union {
typename std::add_pointer::type fptr_;
AnyFn* ftor_;
} data_; // The union is here.
// Tag that identifies the type of data currently stored in the union.
enum class Tag : std::uint8_t { None, Fptr, FtorInline, FtorDync } tag_;

// other methods...
};

В конструкторе, если я обнаружил, что размер объекта меньше, чем Союз, я храню его непосредственно в союзе с новым размещением и отказываюсь от возврата новой.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ub-for-soo
Ответить

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

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

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

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

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