【发布时间】:2018-12-24 16:56:08
【问题描述】:
如果声明声明了成员函数或成员函数 类 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