Q
移动构造函数签名
8
A
回答
9
可移动物体如何成为
const
?
它不能,但那不是语言所说的。该语言表示具有该签名的构造函数是一个“移动构造函数”,但这并不意味着该参数被移出,而只是意味着构造函数符合“移动构造函数”的要求。移动构造函数不需要移动任何东西,如果参数是const
它不能。
有没有这种情况下这种声明是有用的?
是的,但不是很经常。如果要防止在const临时变量作为参数传递时通过重载解析来选择另一个构造函数,这会很有用。
struct Type
{
template<typename T>
Type(T&&); // accepts anything
Type(const Type&) = default;
Type(Type&&) = default;
};
typedef const Type CType;
CType func();
Type t(func()); // calls Type(T&&)
在此代码func()
临时返回将不完全匹配的复制或移动建设者的参数,所以会调用接受任何类型的模板构造。为了防止这种情况,你可以提供不同的过载取一个const右值,并委托授权的拷贝构造函数:
Type(const Type&& t) : Type(t) { }
或者,如果你想防止代码编译,将其定义为删除:
Type(const Type&& t) = delete;
有关使用const rvalue引用的标准示例,请参阅https://stackoverflow.com/a/4940642/981959。
0
有关此功能意图的一些背景知识。
Rvalue references - From Bjarne Stroustrup's Blog
A Proposal to Add Move Semantics Support to the C++ Language
一个有趣的问题。我在某处读过Stroustrup对这个问题的解释,但似乎找不到它。希望以上帮助取而代之。
相关问题
- 1. 与移动构造函数
- 2. 移动构造函数C++
- 3. 移动构造函数不移动
- 4. 移动构造函数并移动类
- 5. 与移动构造函数混淆:无法调用移动构造函数
- 6. 移动构造函数和非常拷贝构造函数
- 7. Move构造函数调用基类移动构造函数
- 8. 在签名中约束构造函数
- 9. C++ - 构造函数,复制构造函数,移动构造函数,析构函数
- 10. 为什么不移动构造函数?
- 11. 关于移动构造函数
- 12. googletest移动构造函数覆盖
- 13. 移动构造函数不工作?
- 14. 显式移动构造函数?
- 15. 用lambda调用移动构造函数
- 16. 移动构造函数和继承
- 17. 明确违约移动构造函数
- 18. 移动构造函数模板elision
- 19. 默认移动构造函数
- 20. std ::线程移动构造函数
- 21. 移动构造函数过度冲击
- 22. 了解移动构造函数,的std ::移动和析构函数
- 23. emplace_back调用移动构造函数和析构函数
- 24. 手动注入构造函数得到错误签名
- 25. 模板构造函数优先于普通副本并移动构造函数?
- 26. 没有默认构造函数导致没有移动构造函数?
- 27. 在Clang上禁用“移动构造函数时删除拷贝构造函数”
- 28. unique_ptr成员,私人拷贝构造函数与移动构造函数
- 29. 为什么调用复制构造函数而不是移动构造函数?
- 30. C++向量执行 - 移动构造函数 - 移动VS向前
简单的回答:不,没有,因为它打破了移动语义学的整个目的。还要注意'&&'不一定要说“可移动”。它只是说“右值参考”。并且* MoveConstructible *在没有移动的情况下会复制,所以你可以说'T const &&'move ctor可能只是复制,但是呃。 – Xeo
好吧,'Type'可以声明一个'mutable'变量,'mutable'变量*可以''const'移动构造函数修改。因此,一个'const'移动构造函数可以做一个对象的浅拷贝(而一个拷贝构造函数可以做一个深层拷贝),并且在被移动的地方设置一个叫做'dead'的可变布尔标志或者类似的''true'目的。然后'Type'(最重要的是析构函数)的函数将检查该标志。这是无稽之谈吗? –