按值返回 ifstream 将编译

Returning ifstream by value compiles

本文关键字:编译 ifstream 返回      更新时间:2023-10-16

我注意到我能够按值从函数返回std::ifstream,而不会编译器给我任何与已删除的复制构造函数相关的错误。这应该不起作用,因为如果流不应该是可复制的,所以我想它以某种方式内联函数?有人对此有解释吗?

我正在运行带有Apple LLVM版本7.3.0(clang-703.0.31(的Mac OSX El Capitan 10.11.6 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;
}

可以删除复制构造函数,但已声明并可访问移动构造函数。从函数返回局部变量时,首先执行重载解析,就好像它是右值一样。这选择要调用哪个 c'tor。如果对象是可移动的(具有可以绑定到右值引用的 c'tor(,则代码的格式将正确。

即使在完成所有这些操作之后,RVO 也可能被应用并且对象根本不会移动。因此,finput虽然在不同的范围内,但将指代同一个对象。

这就是它到C++14的要点。从 C++17 开始,由于保证了复制省略,甚至移动 c'tor 也不需要总是可用。如果您尝试返回纯右值而不是命名的本地,您会注意到这种差异。