使用类型转换构造函数的参数的问题

use*_*871 5 c++ constructor

#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我删除intFoo f(int(x)).我的意思是如果我这样写:

     Foo f(x);
Run Code Online (Sandbox Code Playgroud)

代码编译正确,输出为3.

那么如果我们输入类似Foo f(int(x))的参数来调用构造函数会发生什么呢?

jro*_*rok 4

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)

这使得它成为一个表达式而不是声明。