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

34

请考虑下面的代码片段:

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中失败

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'; }

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


MSVS 2015也可以在没有警告/错误的情况下编译。 - NathanOliver
6
只是好奇:有没有人在SO上报告那些编译器错误? - m.s.
6
这是我不愿在代码库中看到的那种代码。 - Synxis
2
@m.s. 我不太关注 C/C++ 标签,但我看到过很多情况下报告了错误(而且很多时候也很快提供了修复)。 - Bakuriu
坦白说,我甚至不知道C++支持这样的函数声明语法。 - Jamboree
2个回答

25

是的。

auto 并不意味着"任何类型",它代表一个特定的类型,由编译器推导出来。

这并不仅限于函数声明,auto i = 1, f = 4.7;也不行。

此外,在单个语句中声明多个函数似乎也不是一个好主意。


3
你能提供一个标准参考吗?我知道对于变量来说,任何类型推导中的模糊都会失败,但这有些不同,我希望能够清楚,因为这两个编译器对这个问题有不同的看法。 - Marc Andreson

25
基于以下内容,GCC在这种情况下的行为是正确的,但仅仅是巧合(见下文):
§7.1.6.4 [dcl.spec.auto]/8:如果 init-declarator-list 包含多个 init-declarator,则它们都必须形成变量的声明。
为什么仅仅是巧合呢?错误消息是一个线索。将函数更改为推导出相同的返回类型会导致GCC编译该代码。尽管在此处报告错误是正确的,尽管是一个误导性的错误,但只有在推断的类型不一致时才会发生。它应该始终给出错误提示。

1
我们是不是要得出结论,这段代码片段存在错误,并且clang和gcc都是“正确”的?还是说clang在接受代码时有误? - nwp
这个引用是否意味着语句 auto foo(), bar(); 是有问题的,因为它试图声明函数而不是变量? - Ruslan
1
@MarcAndreson,是的,那是我回答的准确描述。如果你要争辩它是允许的(“这是被允许的”),我希望有比我的引用更强有力的依据来证明这一点。 - chris
@chris 所以,问题是§7.1.6.4 [dcl.spec.auto] / 8仅适用于使用auto占位符时吗? - Marc Andreson
1
@MarcAndreson,是的,这个部分特别讲述了auto关键字。 - chris
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接