由引用引起的意外复制构造:我做错了什么?
我有一些复杂的模板代码,其中调用了 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
auto opc
声明一个对象,而不是引用。这与您所说的OPC opc
是一样的。如果您希望
opc
作为参考,则需要auto& OPC
。auto opc
declares an object, not a reference. It is the same as if you had saidOPC opc
.If you want
opc
to be a reference, you needauto& opc
.如果您希望将
opc
作为参考,那么在 C++11 中,
auto
和auto &
(幸运的是)有不同的含义。因此,无论getOPC()
返回一个引用auto opc
都会创建一个对象。If you want to have
opc
as reference than it should be,In C++11,
auto
andauto &
(luckily) have different meanings. So irrespective ofgetOPC()
returning a referenceauto opc
will create an object.