#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".
但是考虑到构造函数的不同之处又是什么呢?
构造函数是成员函数; 如果您想尝试像任何其他函数一样"调用构造函数",则代码可能在您已创建的a.A(i,j);某个对象上使用成员访问运算符a.但这是不允许的,因为构造函数只被称为对象创建的一部分.
A(i, j);匹配语法.该语法的含义是创建该类型的prvalue表达式,其中expression-list是构造函数参数.postfix-expression: simple-type-specifier ( expression-list )
(A)(i, j);与该语法不匹配,因为simple-type-specifier无法括号.但它确实匹配cast-expression,因此它是表达式(i, j)(这是一个逗号运算符表达式)强制转换为A.在这种情况下,转换为类类型的结果涉及构造该类类型的临时类.
foo(i, j);匹配,这是对该参数列表的函数调用postfix-expression: postfix-expression ( expression-list )foo
(foo)(i, j);也匹配相同的规则,因为仍然是.( postfix-expression )postfix-expression