繁体   English   中英

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

[英]What is the purpose of the declaration “template auto A::f(int t) -> decltype(t + g())”

expr.prim.this

如果声明声明了类X的成员函数或成员函数模板,则该表达式是在可选cv-qualifier-seq和函数定义结尾之间的“指向cv-qualifier-seq X的指针”类型的prvalue。 ,成员声明符或声明符。 它不应出现在可选的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

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

关于此构造的名称,它是标准的[temp.explicit]部分中指定的显式实例化定义

暂无
暂无

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

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