首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在按值将参数传递给函数参数时使用复制初始化而不是直接初始化?

为什么在按值将参数传递给函数参数时使用复制初始化而不是直接初始化?
EN

Stack Overflow用户
提问于 2022-08-10 16:37:17
回答 1查看 71关注 0票数 0

我正在使用列出的C++资源学习这里。特别是,在将参数传递给函数参数(按值)时使用复制初始化的I 知道了

例如,来自decl.init.general#14

以大括号或等初始化项或条件(stmt.select)的形式以及在传递的参数、函数返回、抛出异常(except.throw)、处理异常(except.handle)和聚合成员初始化(dcl.init.aggr)的形式进行的初始化称为。

(强调地雷)

,我的问题是,当将参数传递给函数参数时(按值),是否有理由使用复制初始化而不是直接初始化?

为了使问题更简洁,让我们看一个人为的例子:

代码语言:javascript
复制
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)就会成功。

可能有一个原因,比如使用复制初始化参数而不是直接初始化参数的优点,或者使用直接初始化参数而不是复制初始化参数的缺点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-10 17:36:35

正因为如此,这是行不通的。

复制初始化和直接初始化之间区别的全部要点是在复制初始化的情况下防止隐式转换。通过在构造函数中使用explicit,您将声明不希望整数被转换为C,除非用户直接拼写出来。

当您试图调用func(2)时,在呼叫站点附近的任何地方都不能显式地看到C类型。因此,它应该是复制初始化,如果Cint的转换构造函数是explicit,则不应该允许调用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73309856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档