在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
答案 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中,此错误已得到纠正。