由引用引起的意外复制构造:我做错了什么?

发布于 2024-12-11 17:51:28 字数 1044 浏览 0 评论 0原文

我有一些复杂的模板代码,其中调用了 OPC 的复制构造函数,即使我只是创建对 OPC 的引用(实际实例是 OP_S< /code> 作为 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

I have some complex template code where the copy-constructor of OPC is being called even though I am only creating a reference to OPC (the actual instance is OP_S, which as a child class of OPC, should not result in a copy-construction call).

I am using gcc 4.6.1

The code is below.

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

Answer as noted by James McNellis below - need auto& instead of auto.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丘比特射中我 2024-12-18 17:51:28

auto opc 声明一个对象,而不是引用。这与您所说的OPC opc 是一样的。

如果您希望opc作为参考,则需要auto& OPC

auto opc declares an object, not a reference. It is the same as if you had said OPC opc.

If you want opc to be a reference, you need auto& opc.

不必了 2024-12-18 17:51:28

如果您希望将 opc 作为参考,那么

auto &opc = tf.getOPC();

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

If you want to have opc as reference than it should be,

auto &opc = tf.getOPC();

In C++11, auto and auto & (luckily) have different meanings. So irrespective of getOPC() returning a reference auto opc will create an object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文