我想知道在C++0x中,“12.8复制和移动类对象[class.copy]第31段” 中,当发生“复制省略”时,确切的操作是什么:
当满足某些条件时,实现允许省略类对象的复制/移动构造函数[...]。这种复制/移动操作的省略称为复制省略,在以下情况下被允许[...]:
- 在带有类返回类型的函数的返回语句中,当表达式是非易失自动对象的名称[...](与函数返回类型具有相同的cv-unqualified类型)时, 可以通过直接将自动对象构造到函数的返回值中来省略复制/移动操作。 - [...]
现在我想知道,如果采用以下代码,能否使复制省略生效
请注意,我的意图是通过
当满足某些条件时,实现允许省略类对象的复制/移动构造函数[...]。这种复制/移动操作的省略称为复制省略,在以下情况下被允许[...]:
- 在带有类返回类型的函数的返回语句中,当表达式是非易失自动对象的名称[...](与函数返回类型具有相同的cv-unqualified类型)时, 可以通过直接将自动对象构造到函数的返回值中来省略复制/移动操作。 - [...]
现在我想知道,如果采用以下代码,能否使复制省略生效
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引用呢?