主要内容

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 相比,更推荐使用显式类型设定。或者,可以使用括号 () 进行初始化,这可以确保推断出的类型与预期相符。

检查信息

组:声明符
类别:必需、自动
PQL 名称:std.autosar_cpp14.A8_5_3

版本历史记录

在 R2020a 中推出