一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值(evaluated)的,也就是说,对于如下代码:
1 extern int x; 2 3 class A 4 { 5 public: 6 ... 7 //对于函数本体的分析将延迟,直至class申明的}出现时才开始。 8 float X() const { return x; } 9 ... 10 private: 11 float x; 12 ... 13 } 14 //这儿进行该函数的分析,所以此时用到的x不是全局变量x而是class A中的成员x
但是,member function的argument list并不为真。Argument list中的名称还是在它们第一次遭遇时被适当的决议(resolved)完成。下面的程序中,length的类型在两个member function signatures中都被决议(resolved)为global typedef,也就是int。当后续再有length的nested typedef声明出现时,c++标准就把稍早的绑定标志为非法(最后一局没大听懂):
#include <bits/stdc++.h> using namespace std; typedef int length; class A { typedef double length;//如果在这儿声明,那么就没问题。 public: void mumble(length val = 1){ printf("%lf\n", val); } private: //typedef double length;如果在这儿声明的,那么mumble函数中length会被决议为int }; int main() { A a; a.mumble(); return 0; }