隐式声明的移动操作不会回退到复制
Implicitly-declared Move-Operations do not fallback to Copy?
我读N3291 "12.8.(11/15/28)复制和移动类对象类。更正隐式声明的移动构造函数
- 在元素方面移动所有非静态数据成员的(可能通过分别定义的
T(T&&)
) - ,如果任何非静态数据成员不能移动,隐式移动构造函数将被标记为删除,而不是试图复制作为"回退"?(是的,move是为内置类型定义的,但实际上是复制)。
和同样的移动赋值,使用元素各自的T operator=(T&&)
。
的例子:
struct CopyOnly {
CopyOnly();
CopyOnly(const CopyOnly&);
}; // declaring a copy means no implicit move.
struct Question {
std::vector<int> data_;
CopyOnly copyOnly_;
};
Question
类
- 将隐式声明复制构造函数和赋值
- 将隐式声明move-constructor和move-assign, ,但它们将是
=delete
d,因为非静态数据成员data_
是只有copyable,而不是movable?
更新。一个侧面问题:Question q;
将std::move(q)
仍然工作吗?是否会出现倒退到复制的情况?或者隐式声明的移动动作会强制编译器停止并出现错误吗?
更新2。如果我声明移动函数Question(Question&&) =default
,编译器会为不可移动的数据成员生成什么?它然后退回到复制那些吗?
你读错了。在以下情况下,这会破坏许多c++ 03类:
Question getQuestion();
Question q(getQuestion()); // use of deleted move constructor!
相反,FDIS说,如果没有用户声明的{复制构造函数,{copy, move}赋值操作符,析构函数},并且隐式声明的move构造函数不会被定义为删除},则将声明move构造函数。
关于更新2。我注意到,如果您显式默认move构造函数,它将被定义为被条件
删除。用于move构造函数,非静态数据成员或直接基类或虚基类,其类型没有move构造函数,并且通常不具有可复制性。
在下文中,move构造函数将被定义为删除,因为CopyOnly
不是一般的可复制的。
struct Question
{
std::vector<int> data_;
CopyOnly copyOnly_;
Question(Question&&) = default;
};
相关文章:
- 如何在 constexpr 函数中实现回退运行时
- C++通过回退到 C 进行类型双关语
- SFINAE - 如果更复杂的功能失败,则回退到默认功能
- 如何编写模板重载函数,并在模板参数不允许实例化某个类时触发回退
- 调用成员函数(如果存在),回退到自由函数,反之亦然
- 当函数不存在时,SFINAE 回退
- 回退到复制构造函数不起作用
- FindResourceEx和回退语言
- 最后手段/包罗万象/回退模板过载
- 具有最近路径前缀回退的查找树
- 运算符<<() 失败时回退到 to_string()
- 如果未实现除法运算符,则SFINAE回退
- 在c++中,如何用回退包装默认标头
- 为什么成员检测器回退必须是int
- 如果可能,尝试对字符串执行静态断言,或者在不是时回退到运行时检查
- 如果 OpenCV 的 Cuda 扩展不可用,请使用 CPU 回退
- 回退可变构造函数-为什么这样做
- CMake如何确定目标依赖项的回退生成配置
- 隐式声明的移动操作不会回退到复制
- 当模板化函数实例化失败时,回退到备用函数