【问题标题】:What does X f() mean?X f() 是什么意思?
【发布时间】:2018-11-24 23:20:27
【问题描述】:

我看到了这段代码,但我无法理解它的含义。 我知道我们如何使用默认构造函数,但这不是默认构造函数。这是什么?

class X
{
        ...
};

int main()
{
     X f();
}

【问题讨论】:

  • 这是一个函数声明——一个返回 X 的空函数。
  • 主要??喜欢 lambda?
  • @Aryan:一点也不像 lambda。这就像一个前向声明,更像。

标签: c++


【解决方案1】:

它声明了一个函数f,它不接受任何参数并返回一个类型X
这在 C++ 中也称为 Most Vexing Parse。它是 C++ 标准定义声明的解释规则方式的副产品。

【讨论】:

  • +1。然而,这通常被称为“Vexing 解析”。大多数时候,我看到“最令人头疼的解析”指的是X f(X())
  • @Angew:让我更具体一点,X f(X()) 一直被经典地称为最令人烦恼的 Parse,有些人认为X f() 与前者并认为它相似并同样命名,有些人认为X f() 作为一个函数声明比原始的令人烦恼的解析更可预测,因此根本不认为它是最令人烦恼的解析。它更像是一种基于感知的命名法,而不是标准术语,因此本身并没有统一性。很高兴你提出来。谢谢。
  • @Angew - 有趣的是,经过近 20 年的 C++ 开发,我昨天刚刚遇到了 most 令人烦恼的解析。我想直到现在我还没有尝试过这种构造,并且我希望它能够工作,因为我知道所有关于令人烦恼的解析。
【解决方案2】:

假设你声明了一个函数:

int Random();

并使用它:

int main()
{
   int n;
   n = Random();
}

但是在main之后实现Random函数。或者假设 Random 函数在某个标头中定义。您需要指示编译器 Random 是在其他源文件或某个库中实现的函数。

因此,像这样的表达式:

T foo();

总是意味着给编译器的指令是有一个名为foo 的函数返回T。它不能是 T 类型的对象。

【讨论】:

    【解决方案3】:

    其函数名f的声明

      X          f();
      ^          ^ function   
      return type 
    

    函数f() 不接受任何参数并返回一个X 类对象。

    例如它的定义可以是:

    class X{
       int i;
       // other definition
    }
    
    X f(){ 
        X x;
        // some more code
        return x; 
    }  
    

    在 main 中你可以这样使用:

    int main(){
    
     X a = f();
     int i = f().i;
    }
    

    【讨论】:

    • 为什么我们需要这样的东西?
    • @Aryan 与int f(){ i = 10; return i;} 类似,需要在调用函数中返回 X 类对象。 @Ajay 提供了很好的例子。
    【解决方案4】:

    这是一个不带任何参数并返回 X 类对象的函数

    【讨论】: