声明“模板自动A :: f(int t)-> decltype(t + g())”的目的是什么?

时间:2018-12-24 16:56:08

标签: c++ language-lawyer

expr.prim.this

  

如果声明声明一个成员函数或成员函数   X类的模板,它是类型的prvalue的表达式   可选cv-qualifier-seq之间的“指向cv-qualifier-seq X的指针”   以及函数定义,成员声明符或   声明者。它不应出现在可选的cv-qualifier-seq之前   并且它不应出现在静态成员的声明中   函数(尽管其类型和值类别是在   静态成员函数,因为它们在非静态成员中   功能)。 [注意:这是因为声明匹配没有发生   直到知道完整的声明符为止。 —尾注] [注:在   尾随返回类型,所定义的类不必为   为访问类成员而完成。班级成员宣布   以后不可见。

     

示例:

struct A {
  char g();
  template<class T> auto f(T t) -> decltype(t + g())
    { return t + g(); }
};
template auto A::f(int t) -> decltype(t + g());

我对模板了解不多,但是在下面的示例中,我不必使用此声明来实例化成员模板函数A::f

#include<iostream>
#include <iomanip>

struct A {
    char g();
    template<class T> auto f(T t) -> decltype(t + g())
    { return t + g(); }
};

char A::g() { return 'a'; }

struct C {
    operator float() { return 1; }
};

int main()
{
    A a;
    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    std::cout << a.f(1) << '\n';
    std::cout << a.f(1.0) << '\n';
    std::cout << a.f(C{}) << '\n';
} 

可打印

98
98.00
98.00

1 个答案:

答案 0 :(得分:3)

目的是说明您可以在成员函数或成员函数模板的尾随返回类型中使用this(在命名成员函数g时隐含),甚至在类外重新声明成员时:)

关于此构造的名称,它是标准的explicit instantiation definition部分中指定的[temp.explicit]