【问题标题】:What is the meaning of auto when using C++ trailing return type?使用 C++ 尾随返回类型时 auto 是什么意思?
【发布时间】:2012-09-01 02:01:31
【问题描述】:

不同于平常

void foo (void ) {
    cout << "Meaning of life: " << 42 << endl;
}

C++11allows 是另一种选择,使用尾随返回

auto bar (void) -> void {
    cout << "More meaning: " << 43 << endl;
}

在后者中 - auto 旨在代表什么?

另一个例子,考虑函数

auto func (int i) -> int (*)[10] {

}

同样的问题,这个例子中auto是什么意思?

【问题讨论】:

  • 必须阅读这个 - 但我猜什么 - 你没有返回任何东西;-)
  • 请重新阅读问题。 void当然的返回类型,在这种情况下auto是什么意思
  • 第二次得到它错过了->void
  • 应该使用哪个问题:stackoverflow.com/questions/11215227/…

标签: c++ c++11


【解决方案1】:

一般来说,C++11中的new关键字auto表示应该从表达式的结果中推断出表达式的类型(这里是函数的返回类型),在这种情况下,什么发生在-&gt; 之后。

没有它,函数将没有类型(因此不是函数),编译器最终会感到困惑。

【讨论】:

  • 我相信-&gt; 后面的内容表示返回类型,在本例中为void
  • @Jam 是的,它表示应该从该表达式推断返回类型(主要与decltype 一起使用)。
  • 如果我说auto func (int i) -&gt; int (*)[10];,我是在明确返回类型,对吗?为什么还需要auto
  • @Jam:需要 Auto 是因为 C++ 的语法需要返回类型。没有它,您将不会定义一个函数,而是调用一个函数。
  • -&gt; 后面的不是使用类型的表达式,它必须是类型。不要将尾随返回类型与 decltype 混淆(即使它们经常一起使用)。
【解决方案2】:

考虑代码:

template<typename T1, typename T2>
Tx Add(T1 t1, T2 t2)
{
    return t1+t2;
}

这里的返回类型取决于表达式t1+t2,而这又取决于如何调用Add。如果你称它为:

Add(1, 1.4);

T1 将是 intT2 将是 double。结果 type 现在是 double (int+double)。因此 Tx 应该(必须)使用 auto-&gt;

指定
 template<typename T1, typename T2>
    auto Add(T1 t1, T2 t2) -> decltype(t1+t2)
    {
        return t1+t2;
    }

您可以在my article 阅读有关它的信息。

【讨论】:

    【解决方案3】:

    我认为答案比较简单,这里的其他答案没有涵盖。

    基本上,如果没有auto,就会有歧义,因此委员会决定“您需要在此处使用auto 以避免这些歧义”。

    class A {
        T B;
    };
    
    class B;
    
    A* f();
    
    f()->B;
    

    现在,f()-&gt;B 是什么意思?是返回B(带有尾随返回类型语法)的无参数函数,还是对A* f()的函数调用?

    如果我们在尾随返回类型语法的开头没有所需的auto,我们将无法判断。使用auto,很明显这是一个函数调用。

    因此,为避免此处不明确,我们只需在使用尾随返回类型的任何函数声明的开头要求auto

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 1970-01-01
      • 2017-08-02
      • 2017-08-25
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多