为什么这个类对象声明有效?

Vid*_*ani 7 c++ oop

假设我有一堂课

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(...)),使它成为宣告对象的永无止境的方式?

Chr*_*odd 9

这一行:

Test object_name(Test random_name);
Run Code Online (Sandbox Code Playgroud)

声明一个被调用的函数object_name,它接受Test一个参数并返回一个Test.它不声明对象.在另一个函数中声明这样的函数是完全合法的,它只是隐式的extern.

  • @ViditVirmani:这里没有对象 - 只是一个永远不会调用的函数的extern函数声明.如果您尝试调用它,则会出现链接错误,但正如您所描述的那样,没有错误. (2认同)

P.W*_*P.W 6

Test用PoD 代替,int你会看到发生了什么

Test object_name(Test random_name); //1

int object_name(int random_name); //2
Run Code Online (Sandbox Code Playgroud)

您可以看到第二个语句是一个函数声明,它接受一个intas参数并返回一个int.

这是由于CPP中与模糊度解析相关的众所周知的规则.
从CPP工作草案(N4713):

9.8歧义解决[stmt.ambig]

1语法中涉及表达式语句和声明的含糊不清:带有函数式显式类型转换的表达式语句,因为它最左边的子表达式可以与第一个声明符以a开头的声明无法区分(. 在这些情况下,声明是一个声明.

2 [注意:如果语句在语法上不能成为声明,则不存在歧义,因此该规则不适用.可能需要检查整个陈述以确定是否是这种情况.