名稱查詢和訪問檢查
名稱查詢後發生過載解析度。這意味著如果失去名稱查詢,則不會通過過載決策選擇更好匹配的函式:
void f(int x);
struct S {
void f(double x);
void g() { f(42); } // calls S::f because global f is not visible here,
// even though it would be a better match
};
在訪問檢查之前發生過載解析度。如果匹配比可訪問函式更好,則可以通過過載決策選擇不可訪問的函式。
class C {
public:
static void f(double x);
private:
static void f(int x);
};
C::f(42); // Error! Calls private C::f(int) even though public C::f(double) is viable.
類似地,過載解析發生時不檢查結果呼叫是否與 explicit
有關:
struct X {
explicit X(int );
X(char );
};
void foo(X );
foo({4}); // X(int) is better much, but expression is
// ill-formed because selected constructor is explicit