函数定义或变量定义
Function definition or variable definition?
为什么编译器将此行解释为函数定义而不是变量定义:
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());
作为返回Y
的y
作为函数(接受返回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中使用{}
作为构造对象进行了求解。
相关文章:
- 在头文件中定义变量不会出错
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 在命名空间中定义变量
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用不同类型重新定义变量
- 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多的堆栈.为什么?(跳入C++)
- 定义变量类型
- 在命名空间中定义变量,但在测试中获取空值
- cmake没有定义变量
- C 中的继承:在亲子类中定义变量
- 在同一函数中定义变量及其静态等效项
- 如何在 Tensorflow C++ 中定义变量的自定义有状态 Op 保存值
- 如何将 int 和 int* 传递到函数中以定义变量
- 在定义变量时调用类函数
- 定义变量与模板
- 定义变量类型
- 为什么您可以在 switch 语句中的"默认"下定义变量,而不能在"case"下定义变量
- C 如何基于另一个变量和某些算术定义变量的值
- C 可以指向具有定义变量的函数
- C 定义变量设置值