自动返回类型推导强制多个函数具有相同的返回类型吗?

Mar*_*son 34 c++ auto return-type-deduction c++14

请考虑以下代码段:

struct A
{
  auto foo(), bar();
};

auto A::foo() { return 1; }
auto A::bar() { return 'a'; }

int main()
{

}
Run Code Online (Sandbox Code Playgroud)

它在Clang ++ 3.7.0中编译得很好.

它在G ++ 5.2.0中失败:

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'; }
Run Code Online (Sandbox Code Playgroud)

自动返回类型推导是否强制在单个语句中声明的多个函数具有相同的返回类型?

Bo *_*son 25

是.

auto 并不意味着"任何类型",它意味着编译器应该推断出的特定类型.

这不是特定于函数声明,auto i = 1, f = 4.7;也不起作用.

此外,无论如何,在单个语句中声明多个函数似乎并不是一个好主意.

  • 你能提供标准参考吗?我知道在变量的情况下,类型推导中的任何歧义都会失败,但这有点不同,我希望我有清晰度,因为这两个编译器对这个主题有不同的看法 (3认同)

chr*_*ris 25

基于以下内容,GCC在这种情况下具有正确的行为,但只是巧合(见下文):

§7.1.6.4[dcl.spec.auto]/8

如果init-declarator-list包含多个init-declarator,它们都将形成变量声明.

为什么只巧合?错误消息是一个线索.更改函数以推断相同的返回类型会导致GCC编译代码.虽然在这里给出错误是正确的,虽然是误导性的,但只有当推断出的类型不一致时才会这样做.它应该总是出错.