基于范围的循环:自动更改C 11中的含义

Range based loops: Auto changes meaning in C++11

本文关键字:于范围 范围 循环      更新时间:2023-10-16

我试图在C 11中制作基于范围的LOPP:

std::vector<Satellite> Satellites; // Class member
//...
int number = 1;
for(auto sat : this->Satellites) {
    sat.setNumber(number++);
}

我得到了此警告:

'auto'在C 11中更改含义;请删除[-wc 0x-compat]

当然我可以坚持使用for(Satellite sat : this->Satellites),但是我试图测试自动关键字。

我读到C 11的使用是可能的,但是最近我发现自C 0x以来它发生了变化(或者看起来确实如此!):

关键字自动不是新事物;实际上,它可以追溯到前Asi C时代。 但是,C 11改变了其含义。自动不再指定 具有自动存储类型的对象。相反,它声明一个对象 它的类型可根据其初始化器进行推论。汽车的旧含义 从C 11中删除以避免混淆。

so:我能够像这样使用C 11这样使用它,而我的问题在IDE(Eclipse CDT Juno),还是应该以不同的方式使用它(或完全删除自动关键字)?

您的用法在C 11中为" fine",并且在C 03中是无效的语法。

唯一潜在的问题是您正在副本,每种Satellite的副本,这不一定是您想要的。您可能会得到这样的参考:

for(const auto& sat : this->Satellites) { ....

for(auto& sat : this->Satellites) { ....

如果您想对向量元素进行可变的引用。

您应该检查编译器是否完全支持此功能。而它是有效的C 11,警告建议和旧的Pre-C 11标准编译器。

您正在使用非编译器编译,这就是为什么收到消息的原因。