函数定义或变量定义

Function definition or variable definition?

本文关键字:定义 变量 函数      更新时间:2023-10-16

为什么编译器将此行解释为函数定义而不是变量定义:

Y y(X());

在以下代码中:

#include <iostream>
struct X {
  X() { std::cout << "X"; }
};
struct Y {
  Y(const X &x) { std::cout << "Y"; }
  void f() { std::cout << "f"; }
};
int main() {
  Y y(X());
  y.f();
}

VS2010在的第"y.f();"行给出以下错误

left of '.f' must have class/struct/union

标准的哪一部分描述了这种行为?以下问题的答案没有详细说明:最麻烦的解析

考虑一下:

float foo( int () )

这声明了返回float的函数foo(接受返回int的函数)。

现在阅读

Y y(X());

作为返回Yy作为函数(接受返回X的函数)

这个问题是由于C++最麻烦的解析而产生的

可通过以下方式解决:

 Y y{ X() }; // requires C++11

Y y( ( X() ) );
  // ^     ^ notice parenthesis 

基于编辑更新

引用标准

§8.2歧义解决[dcl.ambig.res]

1-6.8中提到的函数样式转换和声明之间的相似性引起的歧义也可能发生在声明的上下文中在这种情况下,可以在参数名周围有一组冗余圆括号的函数声明和将函数样式转换为初始值设定项的对象声明之间进行选择。正如6.8中提到的模棱两可之处一样,该决议将把任何可能是声明的结构视为声明[注意:声明可以通过非函数样式的强制转换、通过表示初始化的=或通过删除参数名称周围多余的括号来显式消除歧义。]

[Example:
struct S {
    S(int);
};
void foo(double a)
{
   S w(int(a));  // function declaration
   S x(int());   // function declaration
   S y((int)a);  // object declaration
   S z = int(a); // object declaration
}
—end example]

与此类似的其他示例。

最麻烦的解析问题。Y y(X())实际上是名为y的函数声明,它返回Y并接收函数类型的参数,返回X但不接收任何内容。

在C++11中使用{}作为构造对象进行了求解。