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&);