我在这里看到了一个代码Cpp Quiz[问题#38]
#include <iostream>
struct Foo
{
Foo(int d) : x(d) {}
int x;
};
int main()
{
double x = 3.14;
Foo f( int(x) );
std::cout << f.x << std::endl;
return 0;
}
据说这段代码格式不正确,因为Foo f( int(x) );
将被视为函数声明而不是类型的对象声明Foo
.
据我所知,这是“最令人烦恼的解析”的一个例子。我的问题是这个语法是什么int(x)
在声明中Foo f( int(x) );
意思是?到目前为止,我只看到了如下函数声明:
-
Foo f( int );
and
-
Foo f( int x );
是不是一样Foo f( int x );
?
这个语法是什么int(x)
在声明中Foo f( int(x) );
mean?
周围的括号x
都是多余的并且会被忽略。所以int(x)
是相同的int x
这里,这意味着一个名为x
与类型int
.
是不是一样Foo f( int x );
?
Yes. Foo f( int(x) );
,是一个名为的函数声明f
,返回Foo
,采用一个名为x
与类型int
.
这是标准的解释。[dcl.ambig.res]/1:
(强调我的)
由于函数风格之间的相似性而产生的歧义
[stmt.abig] 中提到的强制转换和声明也可以出现在
声明的上下文。在这种情况下,选择是
函数声明带有一组多余的括号
参数名称和带有函数风格转换的对象声明
初始化程序。正如文中提到的含糊之处
[stmt.ambig],该决议是考虑任何可能的结构
可能是一个声明.
注意:声明可以是
通过在参数周围添加括号来明确消除歧义。
可以通过使用复制初始化或
列表初始化语法,或使用非函数样式的强制转换。
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 y((int)a); // object declaration
S z = int(a); // object declaration
}
So, int(x)
将被视为(参数的)声明而不是函数样式转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)