将NULL共享指针移交给引用?

时间:2013-08-01 08:52:47

标签: c++ reference shared-ptr

在(现有)代码中,使用共享指针实现“xBinSp”,它主要类似于std :: shared_ptr。有一些方法定义为

setBinaryValue(xBinSp &bin);

必须移交此类共享指针对象。现在有些情况下必须移交NULL(意味着xBinSp())。

调用

setBinaryValue(xBinSp());

导致警告

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

所以我的问题是:在这种情况下,当方法需要引用这样的共享指针时,我怎么能正确地移交“NULL”?创建一个自己的变量并使用它似乎对我来说是浪费资源......

谢谢!

4 个答案:

答案 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。