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

Dar*_*bik 2 c++ copy memcpy language-lawyer c++14

我的问题是这样的:

假设类型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);
}
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 5

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

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

这些东西都没有发生在这里,因此您没有对象。存在隐式对象创建。该类型转换T从技术上讲是UB,因为在处没有类型的对象my_T

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


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