Far*_*nor 2 c++ trailing-return-type
我已经看到了使用尾随返回类型的总是给定的原因之一是当我们想从输入参数中推断出返回类型时。
我知道还有其他原因,但我将重点放在这个问题上。
给定的示例之一是:
template <typename T>
auto func(const T & t) -> decltype(std::cout << t)
{
return std::cout << t;
}
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚这一点的具体用例。
我的意思是,编写函数时我们总是知道函数的返回类型,当确实需要并且无法避免从参数推导返回类型时,我找不到任何具体示例。
我们总是可以(如果我没有记错的话)通过直接指定返回类型而不用任何推导来重写函数的原型,这在我看来使它更加简洁明了。
上面的示例可以重写为:
template <typename T>
std::ostream& func(const T & t)
{
return std::cout << t;
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这比尾随返回类型版本更冗长,更易读。
我想念什么?
我的意思是,我们在编写函数时总是知道函数的返回类型
我们要不要?因此,如果您编写此功能模板:
template<typename A, typename B>
/* ret */ foo(A a, B b) {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
您可以确定是什么ret?如果给定两个整数,则为整数。但是,如果提供一个整数和一个长整数,则由于促销,它应该很长。如果一个参数是双精度型,那么结果应该是双精度双精度型。
如果那是某些类类型的两个对象怎么办?现在我们正在调用重载operator+,并且绝对没有猜测它可能返回什么。
我希望您现在已经确信,通过说我们接受任何两种类型,我们不能总是确定涉及这些类型的表达式的类型是什么。
因此,该语言中增加了一种机制。当然,该示例过于简单,很可能已被auto返回类型所取代,但总的原理仍然存在。在编写通用代码时,我们经常处理未知类型。几乎不知道涉及它们的表达式的类型应该是什么,甚至不知道在函数实例化之前这样的表达式是否有效。decltype告诉我们。