复制语句如何识别其构造函数

How a copy statement recognizes its constructor

在下面的代码中,当执行语句 X loc2 = loc; 时,编译器识别出下​​面的构造函数应该 运行,然后 运行 就可以了。
X(const X& x) { val = x.val; out("X(X&)"); }

我知道构造函数据说是复制构造函数,但我的问题是编译器如何知道构造函数属于该语句?关于复制构造函数的结构应该如何才能识别和执行复制语句时运行是否有任何规则?

#include "std_lib_facilities_4.h"
using namespace std;

struct X {
    int val;
    void out(const string& s) 
           {cerr << this << " -> " << s << ": " << val << "\n\n"; }


    X(int v) { val = v; out("X(int)"); }

    X(const X& x) { val = x.val; out("X(X&)"); } // The copy constructor

};

int main()
{  
    X loc(4);
    X loc2 = loc; // This statement

    char ch;
    cin>>ch;
    return 0;
}

std_lib_facilities 是 here。 我使用的OS是Windows,我的编译器是Visual Studio。

只要构造函数具有以下形式之一,编译时就会自动采用它作为复制构造函数:

X(const X& );
X(X&);
X(volatile X& );
X(const volatile X& );
X(const X&, /*any number of arguments with default values*/);
X(X&, /*any number of arguments with default values*/);

除非您有充分的理由采用替代方案,否则请采用第一个方案。