将NULL共享指针移交给引用

Hand over NULL shared pointer to reference?

本文关键字:引用 指针 NULL 共享      更新时间:2023-10-16

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

setBinaryValue(xBinSp &bin);

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

调用

setBinaryValue(xBinSp());

导致警告

警告C4239:使用了非标准扩展:"argument":从"xBinSp"转换为"xBinSp&"

所以我的问题是:在这种情况下,当方法期望引用这样的共享指针时,我如何才能正确地传递"NULL"?创建自己的变量并使用它对我来说似乎是浪费资源…

谢谢!

这是因为当您使用xBinSp()调用函数时,您正在创建一个临时值,该值将在函数调用完成后立即销毁,并且由于函数需要引用,因此您为函数提供对该临时值的引用。

最简单的解决方案是声明采用const引用的函数:

setBinaryValue(const xBinSp & bin);

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

xBinSp null;
setBinaryValue(null);

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

您可以为零参数的函数创建重载:

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

为空值调用此函数。

当您想更改对象的值时,可以通过引用传递对象:

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

编译器警告您,它正在使用C++的非标准扩展,也就是说,它正在将临时值(xBinSp())绑定到对非常量(xBinSp&)的引用,这通常是不允许的。

临时变量只能绑定到const的引用,并且它们的生存期将延长到绑定到的引用的生存期。

函数setBinaryValue的名称暗示(尽管我可能错了)它为其参数设置了一些值。现在,它认为将其作为临时传递没有多大意义,因为当函数返回时,它会被破坏,而您无法使用该值。即使将签名更改为const xBinSp&,问题仍然存在。

给它一个命名的左值将是你最好的选择,IMO.