C++11-元组和移动语义
C++11 - tuple and move semantics
这个示例代码应该编译吗?clang
和g++
接受它,而icc 14
拒绝这样做,在auto t = ...
上抱怨std::unique_ptr
的复制构造函数未定义。
#include <iostream>
#include <memory>
#include <tuple>
std::tuple<std::unique_ptr<int[]>, int> foo()
{
std::unique_ptr<int[]> a;
unsigned int b;
auto t = std::make_tuple(std::move(a), b);
return std::move(t);
}
int main()
{
foo();
}
我认为它应该编译:std::make_tuple()
的结果是一个临时的std::tuple<T...>
,它应该移动构造它的成员。更确切地说,std::tuple<T...>
的move构造函数是默认的,这将导致成员式的move构造。
显然,不需要将std::make_tuple()
的结果分配给t
。如果选择引入此变量,则在返回时不应使用std::move(t)
:当return
语句中的表达式是局部变量时,无论如何都会将其视为右值。然而,额外的std::move()
会抑制复制/移动省略。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 使用移动和复制语义时函数匹配如何工作?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 视觉理解移动C++标准的语义
- 如何通过move语义移动多个参数