有没有办法强制执行参考左值?

时间:2014-11-08 06:47:19

标签: c++

我想知道是否有办法强制使用参考左值?假设以下情形:

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;
}

此代码将打印出以下内容:

Foo ctor()
Foo dtor()

现在,如果我像这样更改main()函数:

int main()
{
    FooFactory factory;

    Foo foo = factory.create();
    factory.destroy();

    return 0;
}

程序输出:

Foo ctor()
Foo dtor()
Foo dtor()

AFAIK,这是因为在main()对象的foo中创建了一个副本,当main()超出范围时会被销毁。因此,问题是:是否可以强制使用Foo foo&代替Foo foo,以便不会制作副本?

1 个答案:

答案 0 :(得分:4)

如果您有C ++ 11编译器,则显式删除Foo

的复制构造函数(以及可选的复制赋值运算符)
Foo(Foo const&) = delete;
Foo& operator=(Foo const&) = delete;

对于C ++ 11之前的编译器,声明两个private并将它们保留为未定义

private:
  Foo(Foo const&);
  Foo& operator=(Foo const&);