将NULL共享指针移交给引用
Hand over NULL shared pointer to reference?
在(现有)代码中使用了一个共享指针实现"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.
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题