qdi*_*dii 4 c++ fstream move-semantics rvo
我有这个功能:
fstream open_user_file() const
{
...
}
Run Code Online (Sandbox Code Playgroud)
但我的编译器抱怨fstream隐式删除了复制构造函数.鉴于编译器执行RVO,为什么选择复制构造函数而不是移动构造函数?
否则,最好的方法是什么?
目前接受的答案是错误的.
返回具有自动存储的局部变量时,与声明的函数返回类型的类型相同,然后进行两阶段过程:
fstream open_user_file() const
{
fstream f;
/*...*/
return f;
}
Run Code Online (Sandbox Code Playgroud)
首先执行对副本的构造函数的选择,就好像该对象由rvalue指定一样.
如果第一个重载决策失败或未执行,或者所选构造函数的第一个参数的类型不是对象类型的rvalue引用(可能是cv-qualified),则再次执行重载决策,将对象视为左值.
这意味着如果f移动是可构造的,那么返回将是首选(并且可能被省略)f.否则,如果f是复制可构造的,将完成(并可能被省略)返回f.否则f无法从此函数返回,并且应该导致编译时错误.
唯一的情况是:
return std::move(f);
Run Code Online (Sandbox Code Playgroud)
应该有帮助的是实施有缺陷的时候.在一致的实现中,fstream 移动可构造并且:
return f;
Run Code Online (Sandbox Code Playgroud)
将是最佳的.如果f不是可移动的,那么:
return std::move(f);
Run Code Online (Sandbox Code Playgroud)
无助于符合要求的实施.如果在符合要求的实现中编码,则会产生悲观效应,因为它会抑制RVO.
gcc 4.8没有实现可移动流(并且流不可复制).这是你问题的根源.在C++ 98,C++ 03和gcc 4.8中,流不能从函数中返回.在C++ 11中它们是.
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |