4

我写了一个如下函数:

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))?

4

1 回答 1

1

AFAIK 复制省略始终是可选的。标准只是明确地说允许编译器进行这种优化,因为它改变了可观察的行为,它没有强制要求。特别是 12.8 页。31:

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。

免责声明:这是来自社区草案n3690,但 c++11 的版本有类似的声明,如果不完全相同的话

顺便说一句,标准是在那里指定的。

但是,对于移动,这是有保证的。您创建一个临时对象并返回它(即std::make_tuple返回一个rvalue并向前传递),模板的参数不会改变对移动语义的支持。

于 2015-06-26T16:21:52.383 回答