【问题标题】:C++ template auto return type with arrow-notation require decltype?带有箭头符号的 C++ 模板自动返回类型需要 decltype?
【发布时间】:2018-07-31 17:52:51
【问题描述】:

C++11 为函数中的返回类型引入了箭头符号(不知道名称):

template <typename T>
auto fun(T&& a) -> decltype(bar(a)){ ... }

但根据 scott meyer 的说法,使用 auto 作为返回类型本身会删除所有 const 和引用限定符(因为它遵循与模板推导相同的模式),因此惯用的方法是使用 decltype(auto) 来保留所有类型顶部的限定符。

但是,在这种情况下,auto 是否被推断为decltype(bar(a))?那么decltype(auto) 会是decltype(decltype(bar(a))) 吗?那会不会是多余的?

【问题讨论】:

  • 不知道名字这叫做尾随返回类型。
  • 如果你明确指定它,它不会推断任何东西。
  • 这个autoauto somthing = … 不同,所以它不会丢弃任何东西。再读一遍 Scott Meyer 的书。
  • decltype(auto)是一个有其含义的特殊事物,它不是decltype应用于auto推演的结果。

标签: c++ templates c++14


【解决方案1】:

当您有trailing return type 时,auto 关键字纯粹作为符号元素出现。返回类型变为-&gt; 之后的任何类型。不执行类型扣除。这就是带有尾随返回类型的函数声明的简单编写方式。自动返回类型推导仅在您没有有尾随返回类型时发生,即auto 用作占位符返回类型,函数声明符末尾没有-&gt; …。 p>

【讨论】:

  • "自动返回类型推导仅在您没有尾随返回类型时发生,即 auto 用作占位符返回类型,在函数声明符末尾没有 -> ...。"也许是我缺乏英语知识或我醒着很多小时......但这句话对我来说没有多大意义。
  • @Swordfish 答案很明确,也很简单。我猜你的标准 C++ 知识(书本……)已经过时了。您可能需要获得该书的更新版本。但简而言之,有 2 种自动声明的返回类型语法:自动返回类型(无 -> 等...)和尾随返回类型。第二种形式用于通过注入的类型名来简化复杂的类型名。
  • @Red.Wave 你在说auto foo() { retur 42; } vs auto foo() -&gt; some_type { ... 吗?
  • @Swordfish 是的。这就是肯泽尔指出的。如果您需要示例,请让他将它们包括在内。
  • @Red.Wave 没关系,我知道那种语法。我只是对迈克尔的说法感到困惑。英语不是我的母语。
【解决方案2】:

假设int&amp; bar();(或使用尾随返回类型语法auto bar() -&gt; int&amp;;),

你可以声明几个函数:

  • int&amp; f1();auto f1() -&gt; int&amp;;
  • decltype(bar()) f2();auto f2() -&gt; decltype(bar());。 (返回类型为int&amp;)。 decltype 允许将 SFINAE 用于模板函数。
  • decltype(auto) f3() { return bar(); } 需要定义(推断为 int&amp;)(无 SFINAE)。
  • auto f4() { return bar(); } 需要定义(推导为 int)(无 SFINAE)。

decltype(expression)是一个类型,而decltype(type)是无效的,所以 decltype(decltype(expression)) 也无效。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多