【问题标题】:Does auto return type deduction force multiple functions to have the same return type?自动返回类型推导是否强制多个函数具有相同的返回类型?
【发布时间】:2016-01-29 14:18:13
【问题描述】:

考虑下面的sn-p:

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

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

【问题讨论】:

  • MSVS 2015 也将在没有警告/错误的情况下编译。
  • 只是好奇:有没有人提交过在 SO 上发现的那些编译器错误?
  • 在你的情况下 (goo.gl/i09xpE) Clang 隐式地将 'a' 强制转换为 97。
  • 这是我不愿在代码库中看到的那种代码。
  • @m.s.我不太关注 C/C++ 标签,但我已经看到了数十个报告错误报告的案例(而且很多时候也很快提供了修复)。

标签: c++ c++14 auto return-type-deduction


【解决方案1】:

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

§7.1.6.4 [dcl.spec.auto]/8

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

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

【讨论】:

  • 那么我们是否知道 sn-p 格式错误并且 clang 和 gcc 都是“正确的”?还是在接受代码时是错误的?
  • 这句话是否暗示auto foo(), bar(); 语句格式错误,因为它试图声明函数而不是变量?
  • 克里斯,您的回答听起来好像 GCC 基于在单个语句中使用多个函数声明而拒绝代码是正确的。这是允许的,我更感兴趣auto是否会导致歧义
  • @MarcAndreson,是的,这是对我答案的准确描述。如果您要争辩说它确实是允许的(“这是允许的”),我想要一个比我的引用更强大的基础来解释为什么允许以这种方式声明多个函数。
  • @MarcAndreson,是的,该部分专门针对 auto 说明符。
【解决方案2】:

是的。

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

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

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

【讨论】:

  • 你能提供一个标准的参考吗?我知道在变量的情况下,类型推导中的任何歧义都会失败,但这略有不同,我希望我清楚,因为两个编译器对此主题有不同的看法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多