【问题标题】:What is the purpose of the declaration "template auto A::f(int t) -> decltype(t + g())"声明“模板 auto A::f(int t) -> decltype(t + g())”的目的是什么
【发布时间】:2018-12-24 16:56:08
【问题描述】:

expr.prim.this:

如果声明声明了成员函数或成员函数 类 X 的模板,表达式 this 是类型的纯右值 可选的 cv-qualifier-seq 之间的“指向 cv-qualifier-seq X 的指针” 以及函数定义、成员声明符的结尾,或 声明者。它不应出现在可选的 cv-qualifier-seq 之前 并且它不应出现在静态成员的声明中 函数(尽管它的类型和值类别是在一个 静态成员函数,因为它们在非静态成员中 功能)。 [ 注意:这是因为没有发生声明匹配 直到知道完整的声明符。 — 尾注 ] [ 注:在一个 trailing-return-type,被定义的类不需要是 为班级成员访问而填写。声明的类成员 以后看不到了。

例子:

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

【问题讨论】:

  • 该标准不是风格指南。在这种情况下,它提供了示例。示例中的最后一行代码显示了如何在需要时为该模板声明一个特化(注意该行声明了A::f(int))。这并不意味着您必须声明任何特化。所以,是的,如果您不需要专门化 A::f(int),您的代码就可以了。
  • 你能告诉我规范中的哪个语法产生支持这个声明吗?

标签: c++ language-lawyer


【解决方案1】:

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

至于这个构造的名称,它是一个explicit instantiation definition,在标准的[temp.explicit] 部分中指定。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2023-03-28
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2020-10-09
    • 2021-10-29
    相关资源
    最近更新 更多