auto是一个基于范围的可选关键字for循环吗?

Tre*_*key 9 c++ for-loop auto c++17

我记得曾经有人告诉我,

"不需要基于auto内部范围的for循环.如果我们要删除它,那么语言就 不会含糊不清."

这是真实的陈述吗?
以下代码是否有效的C++语法?

for (elem : range){...}  
Run Code Online (Sandbox Code Playgroud)

我原以为这已经是有效的语法,但是当我去编译时
clang++ --std=c++1z,我出现了以下错误:

range-based for loop requires type for loop variable
 for (elem: range){
Run Code Online (Sandbox Code Playgroud)

编译器仍然将其识别为基于范围的for循环,那么为什么它也不能导出类​​型呢?

Sha*_*our 10

的:

for (elem : range){...}  
Run Code Online (Sandbox Code Playgroud)

语法目前无效,但有人建议使用这种有效语法,gcc 5.2支持该语法(请参见实时):

#include <vector>

int main()
{
    std::vector<int> v ;

    for( elem : v )
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们在C++ 14模式下尝试这个,它说:

警告:基于范围的for循环没有类型说明符,仅适用于-std = c ++ 1z或-std = gnu ++ 1z

所以这显然可行,并已在gcc中实现.看起来在gcc 6.0中删除了此功能.

据我所知,这是在gcc中实现的,期望提议N3853:基于范围的For-Loops:下一代将被接受,但它被拒绝,更新版本N3994说:

这更新了N3853(参见[1]),它提出了语法"for(elem:range)",通过添加对属性的支持和回答其他问题.有关此功能背后的基本原理,请参阅原始提案,此处不再重复.

我们可以看到它在EWG第81期被拒绝,我们也可以从Urbana会议纪要中看到这一点.尽管该提案存在许多问题,但我认为STL在提案的问答部分提出了令人信服的一系列论点,我对该提案遭到拒绝感到失望.


Ben*_*igt 2

这确实是一个ELL的问题...

该句子是用虚拟语气写的,这意味着它谈论的是纯粹假设的情况,而不是实际的语言规则。虚拟语气用于反事实情况。