C ++ 11元组带复制省略或移动语义

时间:2015-06-26 15:45:04

标签: c++ c++11 move-semantics copy-elision rvo

我写了一个如下函数:

<link rel="stylesheet" href="/styles/font-awesome-4.3.0/css/font-awesome.min.css">

由于返回类型非常复杂,因此可以保证在c ++ 11下编译器在构造结果时应用复制省略或移动语义,或者我必须明确说出类似std :: move(std: :make_tuple(std :: move(p),10,10))?

1 个答案:

答案 0 :(得分:1)

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

  

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

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

顺便说一下,标准就在那里指定。

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