这个模式在c++中工作吗?
Does this pattern work in C++?
我在我的项目上运行PREfast静态代码分析,它给了我C6001 '使用未初始化内存'错误:
// AutoSelectGDIObject is a class
if (AutoSelectGDIObject & select_image = AutoSelectGDIObject(hDCImgSource, hBmp))
{
// use hDCImgSource knowing that hBmp is selected into it
}
// now we are guaranteed that hDCImgSource has had hBmp removed and its previous bmp re-selected into itself
我试图利用的技巧是允许select_image的作用域仅为if表达式(即if (condition) {expression-block =条件变量的生命周期})。
VS已经愉快地编译了(并且可能运行了)相当长的一段时间。我很久没有像这样单步代码了,但据我所知,只有当select_image的操作符bool()返回true时,它才会进入if块,并且在退出if块时它会破坏select_image的实例。
PREfast是错的吗?或者这里有一些微妙的东西使我的上述代码和假设不正确?
PREfast是错的吗?或者这里有一些微妙的东西使我的上述代码和假设不正确?
这段代码在c++中是无效的,但是VC编译了它,因为它允许将非const
限定类型的左值引用绑定到临时类型。
在我看来,这是一个愚蠢的扩展。根据c++标准,临时变量只能绑定左值引用到const
或右值引用(在这种情况下,它们的生存期延长到创建它们的完整表达式结束之后)。
if
语句应该是:
if (AutoSelectGDIObject const& select_image =
// ^^^^^
AutoSelectGDIObject(hDCImgSource, hBmp))
参见的实例。
但是,请注意,在这里根本不需要使用引用。换句话说,下面的if
语句也是有效的,并且比创建一个临时绑定到const
的左值引用更好地表达了您的意图:
if (AutoSelectGDIObject select_image = AutoSelectGDIObject(hDCImgSource, hBmp))
参见的实例。此外,以上还允许您修改 select_image
,而对const
的引用则不能。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作