#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;
}
Run Code Online (Sandbox Code Playgroud)
当我编译此代码时,我收到以下错误:
[错误]请求'f'中的成员'x',这是非类型'Foo(int)'
假设在int main我删除int的Foo f(int(x)).我的意思是如果我这样写:
Foo f(x);
Run Code Online (Sandbox Code Playgroud)
代码编译正确,输出为3.
那么如果我们输入类似Foo f(int(x))的参数来调用构造函数会发生什么呢?
Foo f(int(x));
它不是类型转换,而是函数声明 - 函数f接受被int调用x并返回Foo。
该语法允许在声明中的标识符周围使用一组(理论上无限的)括号。就像你写的一样
Foo f(int x);
Run Code Online (Sandbox Code Playgroud)
或者
Foo f( int (((x))) );
Run Code Online (Sandbox Code Playgroud)
正如您已经想到的,您不需要进行强制转换,因为 adouble和 之间的转换int是隐式的。但如果你真的想要,你可以说static_cast<int>(x)或者
Foo f((int (x)));
// ^ ^
Run Code Online (Sandbox Code Playgroud)
这使得它成为一个表达式而不是声明。
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |