在C++标准的5.1.1/3中[expr.prim.general]
与其他上下文中的对象表达式不同,*为了在成员函数体外部进行类成员访问,不需要这是完整类型.只有在声明之前声明的类成员才可见.
然后这个例子:
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());
Run Code Online (Sandbox Code Playgroud)
你能解释一下这个引用和例子吗?究竟是什么在这里展示?
这究竟是什么样的?哪个声明在这里展示?
正在证明的陈述是:
与其他上下文中的对象表达式不同,*对于成员函数体外的类成员访问(5.2.5),不需要为完全类型.
在成员函数的主体之外有一个调用g(),这意味着this->g().在那里,*this(即A)的类型不完整.
根据C++ 11标准的第9.2/2段:
}在类说明符结束时,类被视为完全定义的对象类型(3.9)(或完整类型).在类成员规范中,对于非静态数据成员(包括嵌套类中的此类事物),该类在函数体,缺省参数和大括号或大小写初始化中被视为完整.否则,它在其自己的类成员规范中被视为不完整.
这意味着您可以通过this类定义中的外部函数体显式或隐式地访问成员。此时,该类型是不完整的,通常您无法访问不完整类型的成员。
但您只能在成员函数声明的受限部分内执行此操作;前一句说的是this:
它不得出现在可选的cv-qualifier-seq之前
这意味着您不能在参数或前导返回类型规范中使用它。据我所知,在函数体之外,唯一可以使用它的地方是尾随返回类型。
在尾随返回类型中使用时,您可能需要执行此操作decltype,以获取涉及非静态成员的表达式的类型。该示例通过隐式使用尾随返回类型中的thisto 访问来演示这一点。g()如果将其写为 ,则所演示的内容会更清楚decltype(t + this->g())。
| 归档时间: |
|
| 查看次数: |
401 次 |
| 最近记录: |