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类型的现有对象中?
来自[intro.object]的规则是:
当隐式更改联合的活动成员([class.union])或创建临时对象([conv.rval)时,将通过定义([basic.def]),new-expression创建对象。 ],[class.temporary])。
这些东西都没有发生在这里,因此您没有对象。存在隐式对象创建。该类型转换T从技术上讲是UB,因为在处没有类型的对象my_T。
普通可复制的意思是,如果您随后将字节从中复制my_T到另一个T对象中,则将获得与T使用copy构造函数复制了相同的行为。但是您仍然需要对象已经存在。
请注意,这是正在通过P0593积极处理的区域。在很多地方,您实际上只需要说“我在T这里”就可以了,并且每个编译器都已允许这样做。只是这个概念已经远远超出了当今C ++中的对象模型。
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |