我的问题是这个:
假设类型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类型的现有对象中?
答案 0 :(得分:4)
来自[intro.object]的规则是:
在隐式更改联合的活动成员([class.union])或在创建临时对象时,通过定义([basic.def]),新表达式创建对象。 conv.rval],[class.temporary])。
这些都没有发生,因此您没有对象。存在隐式对象创建。该演员表从技术上讲是UB,因为在T
上没有类型my_T
的对象。
简单可复制的意思是,如果您随后将字节从my_T
复制到另一个T
对象,则将得到与刚刚复制T
相同的行为使用复制构造函数。但是您仍然需要对象已经存在。
请注意,这是一个正在通过P0593进行积极工作的领域。在很多地方,您实际上只需要说“我在这里有一个T
”就可以了,并且每个编译器都已允许这样做。只是这个概念远远超出了当今C ++中的对象模型。