C++中构造函数可能存在歧义

cha*_*ink 2 c++ constructor

#include <iostream>
using namespace std;

struct A {
    A(int i) {
        cout << "1 args" << endl;
    }
    A(int i, int j) {
        cout << "2 args" << endl;
    }
};

void foo(int i) {
    cout << "1 args" << endl;
}
void foo(int i, int j) {
    cout << "2 args" << endl;
}

int main() {
    int i, j;
    A(i, j);
    (A)(i, j);
    foo(i, j);
    (foo)(i, j);
}
Run Code Online (Sandbox Code Playgroud)

输出:

2 args
1 args
2 args
2 args
Run Code Online (Sandbox Code Playgroud)

我知道结果"1 args"是因为"(i,j)"被评估为"j".

但是考虑到构造函数的不同之处又是什么呢?

M.M*_*M.M 5

构造函数是成员函数; 如果您想尝试像任何其他函数一样"调用构造函数",则代码可能在您已创建的a.A(i,j);某个对象上使用成员访问运算符a.但这是不允许的,因为构造函数只被称为对象创建的一部分.

  1. A(i, j);匹配语法.该语法的含义是创建该类型的prvalue表达式,其中expression-list是构造函数参数.postfix-expression: simple-type-specifier ( expression-list )

  2. (A)(i, j);与该语法不匹配,因为simple-type-specifier无法括号.但它确实匹配cast-expression,因此它是表达式(i, j)(这是一个逗号运算符表达式)强制转换为A.在这种情况下,转换为类类型的结果涉及构造该类类型的临时类.

  3. foo(i, j);匹配,这是对该参数列表的函数调用postfix-expression: postfix-expression ( expression-list )foo

  4. (foo)(i, j);也匹配相同的规则,因为仍然是.( postfix-expression )postfix-expression