-1

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

setBinaryValue(xBinSp &bin);

必须移交此类共享指针对象的地方。现在有些情况下必须移交 NULL(表示 xBinSp())。

打电话

setBinaryValue(xBinSp());

导致警告

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

所以我的问题是:当方法期望引用这样的共享指针时,我怎样才能正确地交出类似“NULL”的东西?创建一个自己的变量并使用它对我来说似乎是一些资源浪费......

谢谢!

4

4 回答 4

2

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

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

setBinaryValue(const xBinSp & bin);

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

xBinSp null;
setBinaryValue(null);

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

于 2013-08-01T08:55:50.160 回答
1

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

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

一个调用这个空值。

于 2013-08-02T09:17:35.087 回答
0

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

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

该函数的名称setBinaryValue暗示(尽管我可能错了)它为其参数设置了一些值。现在,它认为将它传递一个临时值没有多大意义,因为它会在函数返回时被销毁并且您无法使用该值。即使您将签名更改为采用const xBinSp&.

传递一个命名的左值将是你最好的选择,IMO。

于 2013-08-01T09:04:03.863 回答
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);
}
于 2013-08-01T09:01:17.493 回答