【发布时间】:2015-07-31 19:52:27
【问题描述】:
假设有一个函数返回任何本地对象,它实现了移动语义,例如任何 STL 容器,例如 std::vector、std::string 等。例如:
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
默认情况下,tmp 将被视为右值,tmp 将被移动(或将进行返回值优化)。
问题是如何手动覆盖和避免C++11的默认行为并执行复制构造函数而不是移到这里?一种解决方案可能是为 std::vector 实现一个包装类,禁用移动语义,但这似乎不是一个好的选择。
这种愿望的一个原因可能是调用者在另一个程序集中,如果运行时库是静态链接的,那么会有两个堆。由于跨 DLL 边界分配/删除内存,移动将导致内存断言。
【问题讨论】:
-
尝试通过跨 dll 边界的接口使用标准库类是危险的,期间,无论您是移动还是复制这样做。
-
如果您在
return_vector中复制,那么该副本仍然会从最初分配tmp的存储空间的同一堆中分配,因此您不会在那里保存任何内容。 (跨 DLL 的 C++ 要求痛苦)
标签: c++ c++11 stl move move-semantics