我注意到我能够通过值从函数返回std::ifstream
,而编译器不会给我任何与删除的复制构造函数相关的错误。这不应该起作用,因为ifstreams不应该是可复制的,所以我想它是以某种方式内联函数?有人对此有解释吗?
我使用Apple LLVM版本7.3.0运行Mac OSX El Capitan 10.11.6(clang-703.0.31)g ++
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;
}
答案 0 :(得分:5)
可以删除复制构造函数,但是声明并可访问移动构造函数。从函数返回局部变量时,首先执行重载决策,就好像它是一个右值。选择调用哪个c'tor。如果对象是可构造的(具有可以绑定到右值引用的c'tor),则代码将很好地形成。
即使完成了所有这些操作,也可能会应用RVO并且根本不会移动对象。所以f
和input
虽然在不同的范围内,但会引用同一个对象。
这是C ++ 14的要点。从C ++ 17开始,即使移动c'tor也无需始终可用,这要归功于有保证的复制省略。如果你尝试返回一个纯rvalue而不是命名本地,你会注意到这种差异。