我注意到我能够std::ifstream通过值返回一个函数,而编译器没有给我任何与删除的复制构造函数相关的错误.这应该不起作用,因为ifstreams不应该是可复制的,所以我想它是以某种方式内联函数?有没有人对此有解释?
我正在使用Apple LLVM版本7.3.0(clang-703.0.31)g ++运行Mac OSX El Capitan 10.11.6
ifstream enterFile(){
ifstream input("hello.txt");
return input;
}
int main() {
ifstream f = enterFile();
string line;
while(getline(f, line)) {
cout << line << endl;
}
cout << "===== Done" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
可以删除复制构造函数,但是可以声明并访问移动构造函数.从函数返回局部变量时,首先执行重载决策,就好像它是一个右值.选择调用哪个c'tor.如果对象是可构造的(具有可以绑定到右值引用的c'tor),则代码将很好地形成.
即使在完成所有操作之后,也可能会应用RVO并且根本不会移动对象.所以,f和input,虽然在不同的范围,将指向同一个对象.
这是C++ 14的要点.从C++ 17开始,即使移动c'tor也无需始终可用,这要归功于有保证的复制省略.如果您尝试返回纯rvalue(如果命名为local),则会注意到这种差异.