【问题标题】:Can I implicitly create a trivially copiable type我可以隐式创建一个可简单复制的类型吗
【发布时间】:2019-01-05 10:53:47
【问题描述】:

我的问题是这样的:

假设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 类型的现有对象中?

【问题讨论】:

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


【解决方案1】:

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

当隐式更改联合的活动成员时([class.union])或创建临时对象时([ conv.rval],[class.temporary])。

这里没有发生这些事情,所以你没有对象。存在隐式对象创建。该演员表在技术上是 UB,因为在 my_T 处没有 T 类型的对象。

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


请注意,这是一个通过P0593 积极开展的领域。有很多很多地方你真的只需要说“我在这里有一个T”并进行这项工作,并且每个编译器都已经允许这样做。只是这个概念远远超出了我们今天在 C++ 中使用的对象模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多