我可以隐式创建一个可复制的类型吗

时间:2018-07-28 15:32:21

标签: c++ copy c++14 language-lawyer memcpy

我的问题是这个:

假设类型T是可复制的。...可以在不调用构造函数的情况下“创建”该类型的实例。...就像这样:

#include <type_traits>
#include <cstring>

using T = int; // T can be any trivially copyable type


T create(const T& other)
{
    std::aligned_storage_t<sizeof(T),alignof(T)> my_T;

    std::memcpy(&my_T,&other,sizeof(T));

    return *reinterpret_cast<T*>(&my_T);
}

这是已定义的行为,还是只能复制到T类型的现有对象中?

1 个答案:

答案 0 :(得分:4)

来自[intro.object]的规则是:

  

在隐式更改联合的活动成员([class.union])或在创建临时对象时,通过定义([basic.def]),新表达式创建对象。 conv.rval],[class.temporary])。

这些都没有发生,因此您没有对象。存在隐式对象创建。该演员表从技术上讲是UB,因为在T上没有类型my_T的对象。

简单可复制的意思是,如果您随后将字节从my_T复制到另一个T对象,则将得到与刚刚复制T相同的行为使用复制构造函数。但是您仍然需要对象已经存在。


请注意,这是一个正在通过P0593进行积极工作的领域。在很多地方,您实际上只需要说“我在这里有一个T”就可以了,并且每个编译器都已允许这样做。只是这个概念远远超出了当今C ++中的对象模型。