在 C++11 中使用带有两个声明的 auto 时会发生什么?

v01*_*dya 2 c++ auto c++11

假设有一个这样的循环:

\n\n
for(size_t i=0, n=ar.size(); i<n; ++i)\n{\n  // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

是否可以将其重写为:

\n\n
for(auto i=0, n=ar.size(); i<n; ++i)\n{\n  // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

换句话说,这两个变量将i始终n是相同的数据类型。

\n\n

当我尝试这样的事情时:

\n\n
auto i=0, s="";\n
Run Code Online (Sandbox Code Playgroud)\n\n

g++ 4.8.4 生成错误inconsistent deduction for \xe2\x80\x98auto\xe2\x80\x99: \xe2\x80\x98int\xe2\x80\x99 and then \xe2\x80\x98const char*\xe2\x80\x99。但我无法确定它是否只是 g++,或者根据标准实际上需要使用类型推导中的每个值。

\n

Ker*_* SB 6

这是 [dcl.spec.auto, 7.1.6.4]/8:

如果init-declarator-list包含多个init-declarator,则它们都应构成变量声明。每个声明变量的类型按照上面的描述确定,如果每次推导中替换占位符类型的类型不相同,则程序是格式错误的。

也就是说,所有推导类型必须相同。

同一段中甚至还有一个例子:

auto x = 5, *y = &x;       // OK: auto is int
auto a = 5, b = { 1, 2 };  // error: different types for auto
Run Code Online (Sandbox Code Playgroud)