在函数中返回构造函数参数,在返回时调用构造函数

Returning constructor arguments in function, calls the constructor on return

本文关键字:返回 构造函数 调用 参数 函数      更新时间:2023-10-16

我遇到了一些让我感到惊讶的代码。这在Visual Studio 2012中编译并且运行良好。

描述类

class Description {
public:
    Description(bool valid = false);
    ~Description(void);
};

主要

Description functionThatReturnsADescription()
{
    return 1;
}
int main()
{
    Description theDescription = functionThatReturnsADescription();
}

我对functionThatReturnsADescription()方法感到困惑;返回除描述以外的任何对象如何合法?如果我将其设置为 return 1 ,它会使用 valid = true 调用描述构造函数。如果我将其设置为 return falsereturn 0 ,它会使用 valid = false 调用 Description 构造函数。

这是否意味着C++编译器总是使用 return 语句的参数调用函数的返回类型构造函数?我以前怎么不知道?!我会发誓这不是合法的C++。

返回描述以外的任何对象如何合法?

您可以返回可隐式转换为 Description 的任何类型。在这种情况下,任何数值类型都可以通过标准转换转换为bool,然后通过非显式构造函数转换为Description

如果您愿意,可以通过声明构造函数 explicit 来阻止此转换。养成这种习惯是个好主意,以避免像这样的意外转换。

这是否意味着C++编译器总是使用 return 语句的参数调用函数的返回类型构造函数?

如果类型不匹配,并且有合适的非显式构造函数用于转换,则可以

我以前怎么不知道?!

C++是一种复杂的语言。十五年后,我仍然不断发现我不知道的东西。

1被隐式转换为true,因此选择接受bool的构造函数。

为了防止这种隐式转换,您可以将构造函数标记为 explicit ,在这种情况下,只有

return Description(1);

会工作。

返回值1被隐式转换为布尔true然后作为参数传递给构造函数。Description对象是使用构造函数Description(bool valid = false);隐式创建的。

需要注意的是,这里发生了两个隐式转换:1 →真实的→描述。您可以通过使构造函数explicit来阻止第二次转换。将构造函数的声明更改为

explicit Description(bool valid = false);

但是,第一次转换仍然会发生,即仍然可以执行return Description(1);

参考:C++中的显式关键字是什么意思?