我写了一个函数,如下所示:
template <typename T>
std::tuple<std::vector<T>, T, T> f() {
std::vector<T> p(1000);
return std::make_tuple(std::move(p), 10, 10);
}
由于返回类型非常复杂,是否可以保证在c++11下,编译器在构造结果时会应用复制省略或移动语义,或者我必须明确地说一些类似std::move(std::make_tuple(std::move(p),10,10))的话?
AFAIK副本省略始终是可选的。标准只是明确地说,编译器可以进行这样的优化,因为它改变了可观察的行为,它并没有强制执行
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数有副作用。
免责声明:这来自社区草案n3690,但c++11的版本如果不完全相同,也有类似的声明。
顺便说一下,标准就在那里。
然而,对于搬家来说,这是有保证的。您创建一个临时对象并返回它(即std::make_tuple
返回一个rvalue
并将其向前传递),模板的参数不会改变对移动语义的支持。