调用具有意外结果的默认构造函数

Call of default constructor with unexpected results

我遇到了默认构造函数的意外行为。有了这个class

class Data {
public:
    Data() { std::cout << "default ctor"; }
};

并打电话

Data(x);

调用默认构造函数,而调用

double x;
Data(x);

产生冲突声明'Data x'

我想这是某种令人烦恼的解析,但我看不出这背后的逻辑。您能否解释一下 g++ 编译器是如何看待这一点的?

这里的问题来自于引入 C 的方式。当你写

type(name);

它被解析为声明一个变量,如

type name;

这意味着在

Data(x);

您声明了一个名为 x 的变量,类型为 Data 并且在

double x;
Data(x);

您声明了一个名为 x 且类型为 double 的变量,然后尝试声明一个名为 x 且类型为 Data 的变量。您不能像这样重新定义变量,所以会出错。


如果你只想声明一个临时的 Data 那么语法是

Data();