c++ - 使用“!!”的目的是什么 在 if 语句中
问题描述
我最近看到了下面的代码:
std::error_code ec;
// --- some code
if (!!ec)
{
//error reaction
}
用于什么目的!!
?唯一的想法是强制 bool 运算符,但是为了什么?对于 boost 错误类型的某些实现是否有意义?
解决方案
使用!!
insideif
语句是多余的,因为即使强制转换标记为, if
a 值内部也可能会根据上下文转换为 boolexplicit
。
但是,在赋值中,这个技巧可以替代显式强制转换:
std::error_code ec;
// some code
// bool is_error = ec; // compilation error, operator bool is explicit
bool is_error1 = !!ec; // ok
bool is_error2 = (bool)ec; // better, one may argue
bool is_error3 = static_cast<bool>(ec); // to avoid C-style cast
bool is_error4 = ec.value() != 0; // most verbose, also possible
可能是if(!!ec)
赋值表达式的复制粘贴。
另请参阅:何时可以使用显式运算符 bool 而不进行强制转换?
附注:当然可能存在这种技巧在内部相关if
的情况 - 以防类型实现operator!
和缺少operator bool
- 但情况并非如此std::error_code
。
推荐阅读
- android - RecyclerView 多选和ActionMode
- uiviewcontroller - 容器视图控制器未调用 UIViewControllerTransitioningDelegate 函数
- nginx - 是否可以在nginx中进行多行登录?
- azure-functions - Cosmos DB 触发器 - 共享吞吐量集合应该有一个分区键
- asp.net-web-api2 - 尝试使用 Web Api 2 中用户的无效密码登录时出现错误请求
- http-status-codes - `HTTP/1.1` 响应返回 HTTP 状态代码 `421 Misdirected Request` 是否有意义?
- vue.js - 带有参数的 Vue Js 路由器产生语法错误
- xamarin.forms - 图像识别与匹配
- arrays - 如何通过 setInterval Math.floor Math.random 输出数字数组
- php - JSON REST - URI 或 JSON 正文中的 ID