#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
归档时间: |
|
查看次数: |
47 次 |
最近记录: |