2

我有一些复杂的模板代码,其中的复制构造函数OPC被调用,即使我只是创建一个引用OPC(实际实例是OP_S,它作为 的子类OPC,不应该导致复制构造调用)。

我正在使用 gcc 4.6.1

代码如下。

#include <stdio.h>

class OPC
{
    public:
        OPC() { }
        OPC( const OPC& f ) {
            fprintf( stderr, "CC called!!!\n" );
        }
};

template<class T>
class SL : public T
{ };

template<class T>
class S : public SL<T>
{ };

class OP_S : public S<OPC>
{ };

class TaskFoo
{
    public:
        TaskFoo( OPC& tf ) :
            m_opc(  tf ),
            m_copc( tf )
        { }
        OPC& getOPC() { return m_opc; }

    private:
        OPC&       m_opc;
        const OPC& m_copc;
};

int main(int argc, char** argv)
{
    OP_S op_s;
    TaskFoo tf( op_s );

    auto opc = tf.getOPC();  // this line results in a call to OPC's CC

    return 0;
}

答案如下 James McNellis 所述 - 需要auto&而不是auto.

4

2 回答 2

5

auto opc声明一个对象,而不是一个引用。就像你说的一样OPC opc

如果你想opc成为参考,你需要auto& opc.

于 2011-10-25T06:14:16.350 回答
4

如果你想有opc比它应该的参考,

auto &opc = tf.getOPC();

在 C++11 中,autoauto &(幸运的是)有不同的含义。所以不管getOPC()返回一个引用auto opc都会创建一个对象。

于 2011-10-25T06:14:02.483 回答