为什么编译器将此行解释为函数定义而不是变量定义:
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 () )
这声明了一个函数foo
(接受一个函数返回int
)返回float
.
Now read
Y y(X());
as y
作为函数(接受函数返回X
)返回Y
问题的产生是由于C++ 最麻烦的解析
可以用以下方法解决:
Y y{ X() }; // requires C++11
or
Y y( ( X() ) );
// ^ ^ notice parenthesis
Update基于编辑:
A 引用自标准 :
§ 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]
类似地,其他例子也紧随其后。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)