C++ std::ofstream as类成员是否删除复制构造函数?
以下代码仅在删除类测试的析构函数的定义或删除std::ofstream成员时编译。否则,我会得到一个错误,告诉我测试的复制构造函数已被删除 有人能解释这是为什么吗?谢谢大家!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
#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::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());
}