我写了一个如下函数:
<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))?
答案 0 :(得分:1)
AFAIK复制省略始终是可选的。标准只是明确地说允许编译器进行这样的优化,因为它改变了可观察的行为,它没有强制要求它。特别是12.8 p。 31:
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作和/或析构函数选择的构造函数也是如此。对象有副作用。
免责声明:这是来自社区草案n3690,但c ++ 11的版本如果不完全相同则有类似的声明。
顺便说一下,标准就在那里指定。
但是,对于移动,它是有保证的。你创建一个临时对象并返回它(即std::make_tuple
返回rvalue
并向前传递它),模板的参数不会改变对移动语义的支持。