我想知道当复制省略发生时,是否在 C++0x “ 12.8复制和移动类对象 [class.copy] 第 31 段”中:
当满足某些标准时,允许实现省略类对象的复制/移动构造[...]。这种复制/移动操作的省略,称为复制省略,在以下情况下是允许的 [...]:
- 在具有类返回类型的函数的返回语句中,当表达式是具有与函数返回类型相同的 cv 非限定类型的非易失性自动对象 [...] 的名称时,复制/移动操作可以通过将自动对象直接构造到函数的返回值中来省略
- [...]
现在我想知道,这是否允许在以下代码中逃避复制
vector<string> gen(const char *fn) {
if(fn == nullptr) // this should prevent RVO
return {"House", "Horse", "Hen"};
vector<string> res;
fillFromFile(res, fn);
return res; // copy elision possible?
}
int main() {
vector<string> data = gen("users.dat");
}
还是该规则不适合示例,我必须明确说明?
return move(res); // explicitly prevent copy
请注意,我的意图if
是消除明显的返回值优化(RVO)。
还是我在这里完全走错了路?有一个涉及return
和move的更改可以使用rvalue references,对吗?