假设我有一堂课
class Test{
public:
int x;
Test(const Test& obj){x=obj.x;}
};
Run Code Online (Sandbox Code Playgroud)
为什么
Test object_name(Test random_name);
Run Code Online (Sandbox Code Playgroud)
运行并不需要另一个对象作为参数?.某种类似的东西Test random_name(Test another_random(...))
,使它成为宣告对象的永无止境的方式?
这一行:
Test object_name(Test random_name);
Run Code Online (Sandbox Code Playgroud)
声明一个被调用的函数object_name
,它接受Test
一个参数并返回一个Test
.它不声明对象.在另一个函数中声明这样的函数是完全合法的,它只是隐式的extern
.
Test
用PoD 代替,int
你会看到发生了什么
Test object_name(Test random_name); //1
int object_name(int random_name); //2
Run Code Online (Sandbox Code Playgroud)
您可以看到第二个语句是一个函数声明,它接受一个int
as参数并返回一个int
.
这是由于CPP中与模糊度解析相关的众所周知的规则.
从CPP工作草案(N4713):
9.8歧义解决[stmt.ambig]
1语法中涉及表达式语句和声明的含糊不清:带有函数式显式类型转换的表达式语句,因为它最左边的子表达式可以与第一个声明符以a开头的声明无法区分(. 在这些情况下,声明是一个声明.
2 [注意:如果语句在语法上不能成为声明,则不存在歧义,因此该规则不适用.可能需要检查整个陈述以确定是否是这种情况.