c++ - 从输入参数具体用例推导出尾随返回类型

标签 c++ trailing-return-type

我发现使用尾随返回类型的常见原因之一是当我们想要从输入参数中推导出返回类型时。
我知道还有其他原因,但我在这个问题中重点关注这个特定的原因。

给定的示例之一是:

template <typename T>
auto func(const T & t) -> decltype(std::cout << t)
{
    return std::cout << t;
}

但我无法弄清楚它的任何具体用例。

我的意思是,我们在编写函数时总是知道函数的返回类型,当从参数推导返回类型确实是需要并且不能时,我找不到任何具体的例子避免

我们总是可以(如果我没记错的话)通过直接指定返回类型来重写函数的原型(prototype),而不进行任何推导,这使得它在我看来更加简洁和清晰。

上面的例子可以重写为:

template <typename T>
std::ostream& func(const T & t)
{
    return std::cout << t;
}

在我看来,这比尾随返回类型版本更简洁且更具可读性。

我错过了什么?

最佳答案

I mean, we always know the return type of a function when we write it

我们是吗?所以如果你写这个函数模板:

template<typename A, typename B>
/* ret */ foo(A a, B b) {
  return a + b;
}

你能确定ret是什么吗?如果给定两个整数,那么它肯定是一个整数。但如果提供一个整数和一个长整型,由于促销,它应该很长。如果一个参数是 double ,则结果应该是 double 2。

如果这是某些类类型的两个对象怎么办?现在我们正在调用一个重载的operator+,并且绝对无法猜测它可能返回什么。

我希望您现在确信,通过说我们接受任何两种类型,我们不能总是确定涉及这些类型的表达式的类型是什么。

因此在语言中添加了一种机制来告知。诚然,这个示例过于简单,可能会被 auto 返回类型取代,但一般原则仍然存在。在编写泛型代码时,我们经常会处理未知类型。几乎不知道涉及它们的表达式的类型应该是什么,或者即使这样的表达式在函数实例化之前是否有效。 decltype 告诉我们这一点。

关于c++ - 从输入参数具体用例推导出尾随返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58450981/

相关文章:

c++ - 使用尾随返回类型定义的函数的Doxygen行为

c++ - 为什么我必须将这些引用参数声明为 const 或按值传递?

c++ - 低级编程 C/C++

c++ - 转发声明 HINSTANCE 和 friend

c++ - 嵌套类是否获得外部类的友元关系?

c++ 11 带有 decltype 的尾随返回类型不能按预期工作

c++ - 如何正确编写尾随返回类型?

c++ - 'void()' 中的 'auto f(params) -> decltype(..., void())' 有什么作用?

c++ - 这个尾随返回类型在 C++11 中合法吗?

c# - C++ 中的 nullptr 与 C# 中的 null 相同吗?