我正在使用列出的C++资源学习这里。特别是,在将参数传递给函数参数(按值)时使用复制初始化的I 知道了。
例如,来自decl.init.general#14
以大括号或等初始化项或条件(stmt.select)的形式以及在传递的参数、函数返回、抛出异常(except.throw)、处理异常(except.handle)和聚合成员初始化(dcl.init.aggr)的形式进行的初始化称为。
(强调地雷)
,我的问题是,当将参数传递给函数参数时(按值),是否有理由使用复制初始化而不是直接初始化?
为了使问题更简洁,让我们看一个人为的例子:
struct C
{
explicit C(int)
{
}
};
void func(C param)
{
}
int main()
{
C s1(2); //#1: this works, direct-initialization and so explicit ctor can be used
C s2 = 2; //#2: won't work, copy-initialization and so explict ctor cannot be used here
func(2); //#3: won't work, copy-initialization of parameter param and so explict ctor cannot be used here
return 0;
}正如我们在上面的示例中所看到的,函数调用func(2)不能工作,因为这里参数param是复制初始化的,而不是直接初始化的,因此不能使用显式构造函数C::C(int)。
摘要
,我的问题是,为什么C++标准(委员会)选择复制初始化参数param,而不是使用传递的参数2直接初始化参数。我的意思是,如果param是直接初始化的,那么调用func(2)就会成功。
可能有一个原因,比如使用复制初始化参数而不是直接初始化参数的优点,或者使用直接初始化参数而不是复制初始化参数的缺点。
发布于 2022-08-10 17:36:35
正因为如此,这是行不通的。
复制初始化和直接初始化之间区别的全部要点是在复制初始化的情况下防止隐式转换。通过在构造函数中使用explicit,您将声明不希望整数被转换为C,除非用户直接拼写出来。
当您试图调用func(2)时,在呼叫站点附近的任何地方都不能显式地看到C类型。因此,它应该是复制初始化,如果C从int的转换构造函数是explicit,则不应该允许调用。
https://stackoverflow.com/questions/73309856
复制相似问题