【问题标题】:auto type deduction for function g++ 6.2函数 g++ 6.2 的自动类型推导
【发布时间】:2017-01-12 15:30:14
【问题描述】:

我正在尝试使用现代 C++ 'auto' 并发现一个产生错误的简单示例,但我不明白为什么:

ma​​in.cpp

// error: use of ‘auto test(int)’ before deduction of ‘auto’ int i = test(5);
int i = test(5);

test.h

auto test(int i);

test.cpp

auto test(int i) {
  if (i == 1)
    return i;               // return type deduced as int
  else
    return Correct(i-1)+i;  // ok to call it now
}

但是,如果我使用“->”指定类型,则代码构建并运行良好。例如:

auto test(int i) -> int;

g++ 6.2 是现代版本的编译器,我想知道为什么我必须使用'-> int'。感谢您的建议。

【问题讨论】:

    标签: c++ g++ c++14


    【解决方案1】:

    返回类型推导根本不适用于声明。编译器使用定义(实现)通过检查函数实际返回的内容来推断类型。在声明中不可能这样做,因此当您调用该函数时编译将失败,因为还没有推导出的返回类型。

    当您使用尾随返回类型时,您明确指定返回类型。在您的情况下,这与使用旧的“正常”声明返回类型的方式没有什么不同。

    【讨论】:

    • 我理解你所说的无法从声明中推断出返回类型,但你能否给我一些提示,为什么网上有一些样本,比如我发送的维基百科链接中的样本更多?如果他们不编译,我很想知道他们为什么要编写这些示例。
    • @CarolineBeltran 从您提供的 Wikipedia 链接:“可以向前声明推断其返回类型的函数,但在定义之前不能使用它们。它们的定义必须可供翻译单元使用使用它们。”所以声明可以用于前向声明,前提是定义在你调用函数之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多