繁体   English   中英

什么 - >函数原型意味着什么?

[英]What does -> after a function prototype mean?

这段代码发生了什么? 太令人困惑了。

#include <utility>

struct check
{
   template <typename T>
   auto foo() -> decltype(std::declval<T>().value, void())
   {
      static_assert(T{}.value == 10, "Incorrect value");
   }
} var;

int main()
{
   struct apple
   {
      int value{10};
   };

   var.foo<apple>();
}

特别是它所拥有的部分->以及之后的一切。

让我们一点一点地进行。

auto foo() -> decltype(std::declval<T>().value, void())

这是一种尾随返回类型。 允许使用参数,但这不是必需的。 我猜它写得更清楚。 decltype查找内部表达式的类型,但实际上并未计算该表达式。 std::declval用于创建传递给它的类型的实例。 这里使用逗号运算符使整个返回类型为void ,因为逗号运算符计算左侧,抛出它,计算右侧,然后返回它。

第一部分创建了一种SFINAE(虽然我从来没有看到它像这样使用)。 例如,如果你有一个foo的重载与value2而不是value相同,那么调用它就没有歧义。 这里的我是什么意思。 将它与这个相比较,它只有一个返回类型的void并导致错误。

static_assert(T{}.value == 10, "Incorrect value");

此行确保T的值初始化实例的value成员的值为10.如果不是,则生成具有该文本的编译器错误。

} var;

这只是该类使用的全局对象。

struct apple
{
   int value{10};
};

这是一个用它来测试它的示例类。 它有一个value成员,并且该值在初始化值实例中为10(默认初始化也是如此)。

var.foo<apple>();

这只是调用函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM