Неожиданная копия-конструкция, вызванная ссылкой: что я делаю не так? - PullRequest
2 голосов
/ 25 октября 2011

У меня есть некоторый сложный шаблонный код, где вызывается конструктор копирования 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;
}

Ответ как отметил Джеймс Макнеллис ниже - нужно auto& вместо auto.

Ответы [ 2 ]

5 голосов
/ 25 октября 2011

auto opc объявляет объект, а не ссылку.Это так же, как если бы вы сказали OPC opc.

Если вы хотите, чтобы opc был ссылкой, вам нужно auto& opc.

4 голосов
/ 25 октября 2011

Если вы хотите иметь opc в качестве ссылки, чем должно быть,

auto &opc = tf.getOPC();

В C ++ 11, auto и auto & (к счастью) имеют разные значения.Таким образом, независимо от getOPC() возвращение ссылки auto opc создаст объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...