在C ++ 14中使用auto作为返回和参数类型

时间:2017-07-09 21:13:03

标签: c++ c++14

在Bjarne Stroustrup第4版(C ++编程语言)中,我们读到了:

  

使用auto,我们避免冗余并编写长类型名称。这在通用编程中尤为重要,因为对象的确切类型可能很难让程序员知道,类型名称可能很长(§4.5.1)。

所以,要了解这种类型的重要性。我做了这个小测试程序:

#include <iostream>

/*-----------------------------*/
auto multiplication(auto a, auto b)
{
    return a * b;
}


int main()
{
  auto c = multiplication(5,.134);
  auto d = 5 * .134;
  std::cout<<c<<"\n"<<d<<"\n";

}

该程序的标准输出(用-std = C ++ 14编译):

0
0.67

我想知道为什么我用c和d变量得到不同的结果(类型),即使乘法函数的返回类型是auto。

修改 我的GCC版本:gcc version 5.4.0 20160609

2 个答案:

答案 0 :(得分:9)

首先,您的代码使用gcc extension,即自动功能参数

我猜您的 gcc 版本无法正常使用扩展程序并提供不正确的结果(使用 gcc 7.1 0.67 0.67甚至使用自动参数)

在标准 C ++ 中重写函数的常规方法是应用模板:

template<typename T, typename U>
auto multiplication(T a, U b)
{
    return a * b;
}

让编译器推导出返回类型。

答案 1 :(得分:7)

从Bjarne Stroustrup的第4版开篇书"The C++ Programming Language"开始,并未提及在代码示例中使用的auto。而是标准使用auto specifier

  • 变量的说明符,其类型将由其初始值设定项推导出来(例如auto i = 0;)。
  • 函数返回类型的说明符,它将由其尾随返回类型或其返回语句推断出来。

    auto foo(int a, int b) {return a + b; }

在您的示例中,您指的是使用auto作为C++ extensions for Concepts (N4674)提案建议的占位符。不幸的是,这还不是标准的C ++。它在C ++ 17中被接受,但它没有成功。对C ++ 20的希望现在上升了。但是,像auto这样的maximumAge使用由GCC提供为extension。关于GCC的C ++概念的工作很早就开始了,它甚至早于C ++ 11的出现。在某些时候,关于概念的工作被放弃,然后以另一个名称Concept Lite重新启动。当时的支持非常不稳定(例如,GCC版本5.4)。因此,您遇到的是GCC错误。在更新版本的GCC中,此错误已得到纠正。