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

Me *_*d I 15 c++ c++11

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

#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>();
}
Run Code Online (Sandbox Code Playgroud)

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

chr*_*ris 10

让我们一点一点地进行.

auto foo() -> decltype(std::declval<T>().value, void())
Run Code Online (Sandbox Code Playgroud)

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

第一部分创建了一种SFINAE(虽然我从来没有看到它像这样使用).例如,如果你有过载foo是做了同样用value2代替value,就没有含糊其调用.见这里的我是什么意思.将它与这一个进行比较,它只有一个返回类型void并导致错误.

static_assert(T{}.value == 10, "Incorrect value");
Run Code Online (Sandbox Code Playgroud)

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

} var;
Run Code Online (Sandbox Code Playgroud)

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

struct apple
{
   int value{10};
};
Run Code Online (Sandbox Code Playgroud)

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

var.foo<apple>();
Run Code Online (Sandbox Code Playgroud)

这只是调用函数.