【问题标题】:what is -> in c++ in a function declaration [duplicate]函数声明中的->在c ++中是什么[重复]
【发布时间】:2013-05-04 16:59:34
【问题描述】:

decltypehttp://en.wikipedia.org/wiki/Decltype 上的维基百科文章中,我遇到了这个例子:

int& foo(int& i);
float foo(float& f);

template <class T> auto transparent_forwarder(T& t) −> decltype(foo(t)) {
  return foo(t);
}

虽然我理解了这个函数背后的动机,但我不理解它使用的语法,特别是声明中的-&gt;。什么是 -> 以及它是如何解释的?

编辑 1

基于上述:这里有什么问题?

template <typename T1, typename T2>
auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) {
    return v1 + v2;
}

错误是:

error: expected type-specifier before ‘decltype’
error: expected initializer before ‘decltype

编辑 1 的答案:

哎呀!我忘了在 g++ 中使用-std=c++11 编译器选项。

编辑 2

基于以下答案。我有一个相关的问题:看看下面的声明:

template <typename T1, typename T2>
decltype(*(T1 *) nullptr + *(T2 *) nullptr) sum2(T1 v1, T2 v2);

它使用decltype,而不需要在函数声明中使用-&gt;。那么为什么我们需要-&gt;

【问题讨论】:

  • 致所有投票结束此问题的人。这个问题与我编辑后的链接问题不同。再看看吧。
  • @footy:如果您有新问题,请提出新问题。 SO 是一个问答网站,而不是一个话题讨论网站。

标签: c++ syntax c++11 decltype


【解决方案1】:

这使用尾随返回类型表示法。这个:

auto f() -> T { ... }

相当于这个:

T f() { ... }

优点是,使用尾随返回类型表示法,您可以基于涉及参数的表达式来表达函数的类型,这是经典表示法无法实现的。例如,这将是非法的:

    template <class T>
    decltype(foo(t)) transparent_forwarder(T& t) {
//  ^^^^^^^^^^^^^^^^
//  Error! "t" is not in scope here...

        return foo(t);
    }

关于您的编辑:

基于上述:这里有什么问题?

template <typename T1, typename T2>
auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) {
    return v1 + v2;
}

什么都没有。

关于您的第二次编辑:

[...] 它使用 decltype 而不需要 -> 在函数声明中。那么我们为什么需要 ->

在这种情况下,您不需要 它。但是,使用尾随返回类型的表示法更加清晰,因此人们可能更喜欢它以使代码更易于理解。

【讨论】:

  • 我添加了实际的错误信息。
  • @footy:你的编译器是什么?
  • .. 啊我现在明白了.. 我忘了在 g++ 中使用 -std=c++11 选项
  • @footy: 是这样想的 ;) 好吧,现在你可以玩一下了
  • @footy:虽然这不是使用 SO 的正确方法 :) 如果您有新问题,请提出新问题,而不是编辑已经回答的问题,否则我将不得不继续进一步提问进一步的问题,希望您最终会接受我的回答;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多