主要内容

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

AUTOSAR C++14 Rule A8-5-3

A variable of type auto shall not be initialized using {} or ={} braced-initialization

描述

规则定义

A variable of type auto shall not be initialized using {} or ={} braced-initialization.

理由

当初始化使用大括号时,auto 的类型推断会产生一个反直觉的结果。推断出的类型是 std::initializer_list<>,而不是根据初始化器可能推测出的类型。

例如,定义:

auto x{1};
导致类型 x 变为 std::initializer_list<int> 而不是 int。某些编译器会从该定义推导出 int 类型,但不同编译器的行为并不一致。

Polyspace 实现

如果变量使用 {}={} 大括号初始化,检查项将标记使用类型 auto 的变量定义。

故障排除

如果您预期会出现违规,而 Polyspace® 未报告该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

#include<initializer_list>

void func() {
    auto aVar{1}; //Noncompliant
    auto anotherVar(1); //Compliant
    int aThirdVar{1}; //Compliant
    
    auto aVarList{1,2,3}; //Noncompliant
    std::initializer_list<int> anotherVarList{1,2,3}; //Compliant
}

在此示例中,当 auto 类型与大括号初始化一起使用时,就会违反该规则。最好使用显式类型指定,而不是 auto。或者,初始化可以使用括号 (),这确保了预期类型的推断。

检查信息

组:声明符
类别:必需、自动

版本历史记录

在 R2020a 中推出