主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

Lambda 用作 typeid 操作数

typeid 用于 lambda 表达式

描述

此缺陷在使用 typeid 操作符对 lambda 表达式进行操作时发生。

风险

根据 C++ 标准,lambda 表达式的类型是一个唯一且未命名的类类型。由于类型是唯一的,另一个变量或表达式不能具有相同的类型。在 lambda 表达式中使用 typeid 表示您期望第二个变量或表达式与操作数 lambda 表达式具有相同的类型。以这种方式使用 lambda 表达式的类型可能会导致意外结果。

typeid 返回其操作数的数据类型。通常,运算符用于比较两个变量的类型。例如:

(typeid(var1) == typeid(var2))
比较 var1var2 的类型。此用法不适用于 lambda 表达式,因为 lambda 表达式具有唯一的类型。

修复

避免在 lambda 表达式中使用 typeid 运算符。

示例

全部展开

#include <cstdint>
#include <typeinfo>
 
 void func()
 {
 auto lambdaFirst = []() -> std::int8_t { return 1; };
 auto lambdaSecond = []() -> std::int8_t { return 1; };

 if (typeid(lambdaFirst) == typeid(lambdaSecond))  
     {
     // ...
     }
 }

在 lambda 表达式中使用 typeid 可能会导致意外结果。尽管 lambdaFirstlambdaSecond 看起来具有相同的结构,但上述比较是错误的。

更正 - 在使用之前将 Lambda 表达式分配给函数对象 typeid

一种可能的更正方法是将 lambda 表达式赋给一个函数对象,然后对函数对象使用 typeid 运算符进行比较。

#include <cstdint>
#include <functional>
#include <typeinfo>

 void func()
 {
 std::function<std::int8_t()> functionFirst = []() { return 1; };
 std::function<std::int8_t()> functionSecond = []() { return 1; };

 if (typeid(functionFirst) == typeid(functionSecond)) 
     {
     // ...
     }
 }

结果信息

组:面向对象
语言:C++
默认值:手写代码时为启动,生成代码时为关闭
命令行语法:LAMBDA_TYPE_MISUSE
影响

版本历史记录

在 R2019b 中推出