gpt4 book ai didi

c++ - Visual C++ 警告 C4800,为什么它只在 return 语句上触发?

转载 作者:太空狗 更新时间:2023-10-29 20:07:22 24 4
gpt4 key购买 nike

我刚刚安装了 Windows SDK v7.1 (MSVC 10.0) 并通过(几乎)完全警告级别(W3,qmake 的 CONFIG += warn_on 的默认值)运行我的代码,并且对警告 C4800:“type”:强制值为 bool“true”或“false”(性能警告)

在下面的代码中,stream 是一个 std::istreamtoken 是一个 std::string.

// in some function returning bool
return (stream >> token) // triggers warning c4800:
// '(void *)': forcing value to bool 'true' or 'false' (performance warning)`
// somewhere else
if( stream >> token ) // does not trigger warning c4800

这是怎么回事?我什至不明白为什么首先会触发警告。我认为无论如何,第一段代码已经返回了一个 bool

我知道这是吹毛求疵,警告甚至不应该存在,但它是我的代码中唯一介于 MSVC 的 /W3 和 gcc 的 -Wall -pedantic 之间的警告,所以我想知道:)

小更新:我知道警告旨在让您知道您正在假设 int->bool 转换,但是 1) 为什么您还要使用 bool (== typedef int 主要是) 和 2) 为什么 if(2) 不会将 2 转换为 true 或 false,我认为是谓词的全部概念,是真还是假。

最佳答案

What is going on here? I don't even get why the warning is triggered in the first place. I thought the first bit of code already returned a bool anyways.

  1. Streams 有一个返回 void* 的隐式转换运算符. (这是 safe bool idiom 的一个版本。这样做是因为 void* 编译的上下文比 bool 少,所以隐式转换可能会在不需要的情况下启动的上下文较少。)[1]

  2. 流' operator>>()返回对其左操作数(流)的引用。这样您就可以链接输入操作:strm >> value1 >> value2被执行为 ((strm >> value1) >> value2) .

现在,当你说 if( strm >> value ) , strm >> value被执行并返回一个流。为了将其放入 if语句,隐式转换为 void*执行,然后检查该指针是否为 NULL或者不是。
这与 if(ptr) 没有什么不同, if语句隐式将其条件转换为 bool , 但编译器永远不会对此发出警告,因为条件不是 bool很常见。

随着 return ,这是不同的。如果你想返回某种类型,通常你返回的表达式应该是那种类型。 VC 的警告非常烦人,对我来说 100 次中有 99 次都是多余的。但是剩下的 1%(绝不是性能问题,顺便说一句;我认为警告很愚蠢)让我很高兴警告在那里。

此警告的解决方法是

return 0 != <expression>

哪里<expression>是你认为应该被认为是 bool 值的任何东西。

[1] ISTR Stroustrup 在某处写道 operator bool()如果你搞砸了运算符,将静默编译:ostrm >> 5; (注意 >> 而不是 << )会编译得很好,但默默地做了错误的事情。 (它将 bool 值转换为整数并将其右移 5 次,然后丢弃该值。)

关于c++ - Visual C++ 警告 C4800,为什么它只在 return 语句上触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3231611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com