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

Posted

技术标签:

【中文标题】基于范围的循环:自动更改 C++11 中的含义【英文标题】:Range based loops: Auto changes meaning in C++11 【发布时间】:2014-02-10 19:22:55 【问题描述】:

我试图在 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-&gt;Satellites),但我正在尝试测试 auto 关键字。

我曾读过 C++11 可以使用 auto,但 recently I found 自 C++0x 以来它发生了变化(或者看起来确实如此!):

关键字 auto 并不新鲜;它实际上可以追溯到 ANSI C 之前的时代。 但是,C++11 改变了它的含义; auto 不再指定一个 具有自动存储类型的对象。相反,它声明了一个对象 其类型可从其初始化程序中推导出来。汽车的旧含义 已从 C++11 中删除以避免混淆。

那么:我能否像这样在 C++11 中使用它,而我的问题出在 IDE(Eclipse CDT Juno)上,还是应该以不同的方式使用它(或完全删除 auto 关键字)?

【问题讨论】:

【参考方案1】:

您在 C++11 中的用法“很好”,在 C++03 中是无效语法。

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

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

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

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

您应该检查您的编译器是否完全支持此功能。虽然它是有效的 C++11,但警告建议使用旧的 C++11 之前的标准编译器。

【讨论】:

感谢您避免复制的建议!我有 cpp 4.8.1,所以我认为我的编译器版本很好。所以问题一定出在 Makefile 上(如果 CDT Juno 仍然使用它,因为我不确定:我必须将每个 src 文件夹添加到项目属性中,这在旧 CDT 版本中是不需要的)。也许我在项目属性中缺少一些标志? Aaaaand,我确定我是:***.com/questions/17457069/…【参考方案2】:

您正在使用非 11 编译器进行编译,这就是您收到消息的原因。

【讨论】:

以上是关于基于范围的循环:自动更改 C++11 中的含义的主要内容,如果未能解决你的问题,请参考以下文章

C++基于范围的for循环详解

C++11 反向基于范围的 for 循环

C++11 反向基于范围的 for 循环

C++11 基于范围的for循环

求C语言各关键字的含义。急!!!

C++11使用auto关键字进行基于范围的for循环,引用符号&的作用