按值返回ifstream编译

gow*_*ath 1 c++

我注意到我能够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)

Sto*_*ica 5

可以删除复制构造函数,但是可以声明并访问移动构造函数.从函数返回局部变量时,首先执行重载决策,就好像它是一个右值.选择调用哪个c'tor.如果对象是可构造的(具有可以绑定到右值引用的c'tor),则代码将很好地形成.

即使在完成所有操作之后,也可能会应用RVO并且根本不会移动对象.所以,finput,虽然在不同的范围,将指向同一个对象.

这是C++ 14的要点.从C++ 17开始,即使移动c'tor也无需始终可用,这要归功于有保证的复制省略.如果您尝试返回纯rvalue(如果命名为local),则会注意到这种差异.