C++ std::ofstream as类成员是否删除复制构造函数?

C++ std::ofstream as类成员是否删除复制构造函数?,c++,C++,以下代码仅在删除类测试的析构函数的定义或删除std::ofstream成员时编译。否则,我会得到一个错误,告诉我测试的复制构造函数已被删除 有人能解释这是为什么吗?谢谢大家! #include<fstream> #include<vector> class Test { public: Test() {}; ~Test() {}; std::ofstream ofs; }; int main() { std::vector<Te

以下代码仅在删除类测试的析构函数的定义或删除std::ofstream成员时编译。否则,我会得到一个错误,告诉我测试的复制构造函数已被删除

有人能解释这是为什么吗?谢谢大家!

#include<fstream>
#include<vector>

class Test {
public:
    Test() {};
    ~Test() {};
    std::ofstream ofs;

};

int main() {
    std::vector<Test> vec;
    vec.emplace_back(Test());
} 
编辑:如果只是因为std::ofstream不可复制而删除了测试的复制构造函数,为什么要编译它

#include<fstream>
#include<vector>

class Test {
public:
    Test() {};
    //~Test() {};
    std::ofstream ofs;

};

int main() {
    std::vector<Test> vec;
    vec.emplace_back(Test());
}
#包括
#包括
课堂测试{
公众:
Test(){};
//~Test(){};
std::ofs流;
};
int main(){
std::vec;
向量放置回(Test());
}

std::ofstream有一个已删除的副本构造函数:。当你把它放在向量中时,
测试
会被复制。这会失败,因为std::of Stream没有复制构造函数。您需要定义自己的复制构造函数来处理ofs:

#include<fstream>
#include<vector>

class Test 
{
public:
    Test() {};
    ~Test() {};
    Test(const Test& other) 
    {
    // does not make sense of course
    };
    std::ofstream ofs;
};

int main() {
    std::vector<Test> vec;
    vec.emplace_back(Test());
} 
#包括
#包括
课堂测试
{
公众:
Test(){};
~Test(){};
测试(常数测试和其他)
{
//当然没有意义
};
std::ofs流;
};
int main(){
std::vec;
向量放置回(Test());
} 

若类并没有复制构造函数,编译器将为您生成一个,即
默认复制构造函数<代码>默认复制构造函数
的行为是逐个成员复制属性,这可能会调用成员的复制构造函数

std::of Stream
不是为复制而设计的,因此它将其复制构造函数标记为已删除,以防止意外复制。然后,当
默认复制构造函数
调用
std::ofstream
deleted
复制构造函数时,会显示编译错误

可能的解决办法:

  • 定义自己的复制构造函数。控制您自己的复制行为
  • 或者将复制构造函数标记为已删除,以防止复制类,与
    std::ofstream
    相同
  • 或者将您的成员
    ofs
    作为引用类型
    std::ofstream&
    捕获引用,而不是独立实例。(或
    std::of流*
    指针)
  • 如果只是因为std::ofstream不可复制而删除了测试的复制构造函数,为什么要编译它

    “空”析构函数阻止您的原因是声明析构函数会抑制移动构造函数的隐式生成,因此在向量必须增长的情况下,
    std::vector::emplace_back
    必须复制
    Test
    元素


    如果没有析构函数,那么就得到隐式move构造函数,它使用
    std::ofstream::ofstream(ofstream&&)

    谢谢。到目前为止,我理解。我已经编辑了我的原始问题。显式定义或不定义析构函数的角色让我感到困惑。吹毛求疵:隐式定义的
    Test
    复制构造函数被定义为已删除,因此选项2不相关。它不是“默认构造函数”,即
    Test()
    @Caleth谢谢。我错误地将
    默认复制构造函数
    写为
    默认构造函数
    #include<fstream>
    #include<vector>
    
    class Test 
    {
    public:
        Test() {};
        ~Test() {};
        Test(const Test& other) 
        {
        // does not make sense of course
        };
        std::ofstream ofs;
    };
    
    int main() {
        std::vector<Test> vec;
        vec.emplace_back(Test());
    }