如何将 C++ 类型标记为不可“trivially_copyable”,同时在 Itanium C++ ABI 中保持“对于调用而言是微不足道的”?

问题描述 投票:0回答:1

我希望我的 C++ 类型公开一个仅移动接口,因此我将其复制构造函数和复制赋值声明为已删除。 尽管如此,移动构造函数和移动赋值都很简单,析构函数也很简单,因此对于 C++ 标准来说,它被认为是“trivially_copyable”。 这是一个问题,因为复制这种类型的对象在语义上确实是错误的。

一个可能的解决方案是用户定义一个不执行任何操作的空析构函数。 这使得该类型不再“trivially_copyable”,但结果是该类型对于 Itanium ABI 不再“对于调用而言是微不足道的”,这可能会对性能产生负面影响。

有没有办法同时实现所有这些目标? 该类型应该具有简单的移动构造函数、移动赋值函数和析构函数。 该类型不应该是可轻易复制的。 对于调用 Itanium ABI 的目的,该类型应该很简单。

c++ abi itanium
1个回答
0
投票

您可以使移动构造函数变得简单,但移动赋值却变得不那么简单,即

struct MyType {
    //...
    MyType(MyType&&) noexcept = default;
    inline MyType& operator=(MyType&&) noexcept;
    //...
};
inline MyType& MyType::operator=(MyType&&) noexcept = default;

要使类型成为“普通可复制”,所有符合条件的非删除构造函数、析构函数和赋值运算符都必须是普通的。然而,为了调用目的而微不足道属性仅查看构造函数和析构函数。 该类型应该具有简单的移动构造函数、移动赋值函数和析构函数。

不,这个要求使它不可能。您基本上要求该类型可以简单复制,但又不能简单复制。您的要求基本上就是该属性的定义。

© www.soinside.com 2019 - 2024. All rights reserved.