在(现有)代码中,使用共享指针实现“xBinSp”,它主要类似于std :: shared_ptr。有一些方法定义为
setBinaryValue(xBinSp &bin);
必须移交此类共享指针对象。现在有些情况下必须移交NULL(意味着xBinSp())。
调用
setBinaryValue(xBinSp());
导致警告
警告C4239:使用非标准扩展名:'参数':从'xBinSp'转换为'xBinSp&'
所以我的问题是:在这种情况下,当方法需要引用这样的共享指针时,我怎么能正确地移交“NULL”?创建一个自己的变量并使用它似乎对我来说是浪费资源......
谢谢!
答案 0 :(得分:2)
这是因为当您使用xBinSp()
调用该函数时,您正在创建一个临时值,该值将在函数调用完成后立即销毁,并且该函数需要引用,你给函数一个这个临时值的引用。
最简单的解决方案是声明函数采用const
引用:
setBinaryValue(const xBinSp & bin);
如果你不能这样做,那么你必须创建一个非临时实例,并将其传递给函数:
xBinSp null;
setBinaryValue(null);
但在这两种情况下,您都必须注意该功能不会保存此引用以供将来访问。
答案 1 :(得分:1)
您可以使用零参数为函数创建重载:
void setBinaryValue() {
xBinSp bin;
setBinaryValue(bin);
}
将此值称为空值。
答案 2 :(得分: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);
}
答案 3 :(得分:0)
编译器警告你它正在使用C ++的非标准扩展,也就是说,它将临时值(xBinSp()
)绑定到对非const(xBinSp&
)的引用,通常不被允许。
Temporaries只能绑定到const的引用,并且它们的生命周期会扩展到它们绑定的引用的生命周期。
函数setBinaryValue
的名称暗示(尽管我可能错了)它为其参数设置了一些值。现在,它认为将它传递给临时是没有多大意义的,因为它会在函数返回时被销毁而你无法使用该值。即使您将签名更改为const xBinSp&
,问题仍然存在。
将它命名为左值是最好的选择,IMO。