C++ 有没有办法强制执行引用左值?
我想知道是否有办法强制使用引用左值?假设出现以下情况:C++ 有没有办法强制执行引用左值?,c++,C++,我想知道是否有办法强制使用引用左值?假设出现以下情况: class Foo { public: Foo() { std::cout << "Foo ctor()" << std::endl; } ~Foo() { std::cout << "Foo dtor()" << std::endl; } }; class FooFactory { public: F
class Foo
{
public:
Foo()
{
std::cout << "Foo ctor()" << std::endl;
}
~Foo()
{
std::cout << "Foo dtor()" << std::endl;
}
};
class FooFactory
{
public:
Foo& create()
{
m_foo = new Foo();
return *m_foo;
}
void destroy()
{
delete m_foo;
}
private:
Foo* m_foo;
};
int main()
{
FooFactory factory;
Foo& foo = factory.create();
factory.destroy();
return 0;
}
现在,如果我像这样更改主函数:
int main()
{
FooFactory factory;
Foo foo = factory.create();
factory.destroy();
return 0;
}
程序输出:
Foo ctor()
Foo dtor()
Foo dtor()
好吧,这是因为在foo对象的main中创建了一个副本,当main超出范围时,它就会被销毁。因此,问题是:有没有可能强制使用Foo-Foo&而不是Foo-Foo,这样就不会产生副本?如果您有一个C++11编译器,那么显式删除Foo的复制构造函数和可选的复制赋值操作符 对于C++11之前的编译器,声明这两个函数为private,不定义它们
private:
Foo(Foo const&);
Foo& operator=(Foo const&);
如果您有一个C++11编译器,那么显式删除复制构造函数和Foo的复制赋值运算符(可选) 对于C++11之前的编译器,声明这两个函数为private,不定义它们
private:
Foo(Foo const&);
Foo& operator=(Foo const&);
将复制构造函数声明为已删除?将复制构造函数声明为已删除?谢谢,这似乎很管用。一个小问题:是否有必要在C++11中执行=删除?它有什么好处?@manabreak不,没有必要,您也可以将C++03解决方案与C++11编译器一起使用。但是使用C++03方法,您可能会无意中让其他成员函数或Foo之友调用复制特殊成员函数,这将导致链接器错误而不是编译器错误。C++11方式会导致编译器错误,这可能更容易理解它发生的原因。谢谢你,它似乎做到了这一点。一个小问题:是否有必要在C++11中执行=删除?它有什么好处?@manabreak不,没有必要,您也可以将C++03解决方案与C++11编译器一起使用。但是使用C++03方法,您可能会无意中让其他成员函数或Foo之友调用复制特殊成员函数,这将导致链接器错误而不是编译器错误。C++11方式会导致编译器错误,这可能更容易理解它发生的原因。
private:
Foo(Foo const&);
Foo& operator=(Foo const&);