#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);
}
输出:
2 args
1 args
2 args
2 args
我知道结果&#34; 1 args&#34;是因为&#34;(i,j)&#34;被评估为&#34; j&#34;。
但考虑到构造函数的不同之处还有什么功能呢?
答案 0 :(得分:5)
构造函数是成员函数;如果您想尝试像任何其他函数一样“调用构造函数”,则代码可能是a.A(i,j);
使用您已创建的某个对象a
上的成员访问运算符。但这是不允许的,因为构造函数只被称为对象创建的一部分。
A(i, j);
符合语法 postfix-expression:
simple-type-specifier
(
expression-list
{{ 1}}。该语法的含义是创建该类型的prvalue表达式,其中expression-list是构造函数参数。
)
与该语法不匹配,因为 (A)(i, j);
无法括号。但它确实与 simple-type-specifier
匹配,因此表达式cast-expression
(这是一个逗号运算符表达式)强制转换为(i, j)
。在这种情况下,转换为类类型的结果涉及构造该类类型的临时类型。
A
匹配 foo(i, j);
postfix-expression:
postfix-expression
(
{{1} },这是一个带有该参数列表的函数expression-list
的调用
)
也匹配相同的规则,因为foo
(foo)(i, j);
(
仍然是 postfix-expression
}
答案 1 :(得分:0)
对于那些寻找技术性答案的人,我会阅读M.M answer之类的内容:
A 是类型而 foo不是,所以:
(A)(i, j); // cast to A the result of (i, j) ==> calls A(j) in conversion
(foo)(i, j) // still the same as foo(i, j)