2013-08-01 39 views
-1

在(现有的)代码中,使用了一个共享指针实现“xBinSp”,它与std :: shared_ptr类似。有一些方法定义为将NULL共享指针交给引用?

setBinaryValue(xBinSp &bin); 

其中这样的共享指针对象必须被移交。现在有些情况下,NULL(意味着xBinSp())将不得不移交。

调用

setBinaryValue(xBinSp()); 

导致一个警告

警告C4239:使用非标准扩展: '参数':从 'xBinSp' 转换为 'xBinSp &'

所以我的问题:如何我可以正确地交出“NULL”的东西 - 就像这种情况下,当方法期望引用这样的共享指针吗?创建自己的变量和使用它似乎是一些浪费资源给我...

谢谢!

+0

我只是通过'xBinSp'。 –

+0

我看到答案中解释了机制,但为什么根本不调用函数。它有其他副作用,然后修改参数? – Marius

+0

函数HAS将被调用由应用程序本身的逻辑定义,以重置可能早先设置的其他二进制值。所以这是一个合法的状态,将二进制数据(即空指针又名空共享指针)交给这个方法。 – Elmi

回答

1

,你可以创建功能的过载零个参数:

void setBinaryValue() { 
    xBinSp bin; 
    setBinaryValue(bin); 
} 

的电话本一个空值。

2

这是因为当你调用函数与xBinSp()您正在创建一个临时值将尽快函数调用完成销毁,并作为函数想要一个参考,你给的功能,这是一个参考临时值。

最简单的解决方法是声明函数采取const参考:

setBinaryValue(const xBinSp & bin); 

如果你不能做到这一点,那么你必须创建一个非临时实例,并传递给函数:

xBinSp null; 
setBinaryValue(null); 

在这两种情况下,您都必须注意,该函数不会保存此引用以供将来访问。

0

,当你想改变自己的价值观您通过引用传递对象:

template <typename T1, typename T2> 
void swap(T1 & t1, T2 & t2) 
{ 
    T1 tmp = t1; 
    t1 = t2; 
    t2 = tmp; 
} 

所以,如果你swap(a,b),函数调用a之后将有b价值,反之亦然。这对临时工不起作用。

由于C++ 11有解决的办法 - 右值引用:

template <typename T1, typename T2> 
void swap(T1 && t1, T2 && t2) 
{ 
    T1 tmp = t1; 
    t1 = t2; 
    t2 = std::move(tmp); 
} 
0

编译器警告你,它使用的是非标准扩展C++的,也就是说,它是有约束力的临时值(xBinSp())与通常不被允许的非const(xBinSp&)的引用相关联。

临时只能绑定到对const的引用,并且它们的生命周期被扩展到它们绑定到的引用的时间。

功能setBinaryValue的名称意味着(虽然我可能是错的)它为它的参数设置了一些值。现在,它认为把它传递给临时代码是没有什么意义的,因为当函数返回时它会被销毁,并且你不能使用这个值。即使您将签名更改为const xBinSp&,问题仍然存在。

通过一个名为左值将是你最好的选择,国际海事组织。