它是否格式正确,如果我将变量重新定义为auto,并且推导的类型是相同的?

gez*_*eza 11 c++ variable-declaration language-lawyer auto

看看这个片段:

int a;
extern int b;
auto b = a;
Run Code Online (Sandbox Code Playgroud)

它结构良好吗?Clang成功编译了它,但是GCC和MSVC没有.

(当我回答如何声明和定义具有推导类型的静态成员时出现了这个问题)

zne*_*eak 5

Clang,GCC,MSVC.(之前的回答是,所有3个编译器都会拒绝构建它,但这是不正确的.)

在将auto类型说明符与其他类型说明符混合时,dcl.spec.auto不解决同一变量的多个声明的兼容性.但是,它为函数返回类型解决了它:

auto f();
auto f() { return 42; } // return type is int
auto f();               // OK
int f();                // error, cannot be overloaded with auto f()
decltype(auto) f();     // error, auto and decltype(auto) don't match
Run Code Online (Sandbox Code Playgroud)

因此,我的直觉是,这是标准中的疏忽,行为目前尚未明确,但如果/何时指定,将有先例使其成为非法行为.(另一方面,变量不能超载,所以谁知道.)


Sha*_*our 3

Tl;博士;

clang 是正确的,逻辑是这是允许的,[dcl.spec.auto]并限制推导出的返回类型[dcl.spec.auto]p11添加,否则没有限制,因此这对于变量情况不受限制。

在副本中查看我更完整的答案