具有复制省略或移动语义的C++11元组



我写了一个函数,如下所示:

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并将其向前传递),模板的参数不会改变对移动语义的支持。

最新更新