考虑以下代码段:
struct A
{
auto foo(), bar();
};
auto A::foo() { return 1; }
auto A::bar() { return 'a'; }
int main()
{
}
它在Clang ++ 3.7.0中编译得很好。
G ++ 5.2.0中的fails:
main.cpp: In member function 'auto A::bar()':
main.cpp:7:24: error: inconsistent deduction for 'auto': 'int' and then 'char'
auto A::bar() { return 'a'; }
自动返回类型推导是否强制在单个语句中声明的多个函数具有相同的返回类型?
答案 0 :(得分:25)
是
auto
并不意味着"任何类型",它意味着编译器应该推断出的特定类型。
这不是特定于函数声明,auto i = 1, f = 4.7;
也不起作用。
另外,在单个语句中声明多个函数无论如何都不是一个好主意。
答案 1 :(得分:25)
基于以下内容,GCC在这种情况下具有正确的行为,但只是巧合(见下文):
§7.1.6.4[dcl.spec.auto] / 8
如果init-declarator-list包含多个init-declarator,它们都将形成变量声明。
为什么只巧合?错误消息是一个线索。更改函数以推断相同的返回类型会导致GCC编译代码。虽然在这里给出错误是正确的,虽然是误导性的,但只有当推断出的类型不一致时才会这样做。它应该总是出错。