按值返回ifstream汇编

时间:2018-03-12 08:40:17

标签: c++

我注意到我能够通过值从函数返回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;

}

1 个答案:

答案 0 :(得分:5)

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

即使完成了所有这些操作,也可能会应用RVO并且根本不会移动对象。所以finput虽然在不同的范围内,但会引用同一个对象。

这是C ++ 14的要点。从C ++ 17开始,即使移动c'tor也无需始终可用,这要归功于有保证的复制省略。如果你尝试返回一个纯rvalue而不是命名本地,你会注意到这种差异。