gpt4 book ai didi

c++ - 为什么在列表初始化函数参数时显式构造函数不匹配?

转载 作者:行者123 更新时间:2023-11-30 05:19:20 26 4
gpt4 key购买 nike

为了说明这个问题,让我们考虑这两个简单的定义,Bar 是一个用户类型,具有来自 int 的显式构造函数:

struct Bar
{
explicit Bar(int a)
{}
};

void f(Bar)
{}

现在,作为cppreference状态:

direct-list-initialization (both explicit and non-explicit constructors are considered)

我们可以这样初始化一个实例

小节 b1{5};

然而,以这种方式调用函数是一个编译错误

f({5});

它仍然天真地看起来像 fBar 参数的直接列表初始化,而且有人可能会争辩说,在参数周围显式使用大括号使其......显式.

禁止对列表初始化函数参数使用显式构造函数的理由是什么?

编辑

链接页面确实在说在这种情况下这不是直接列表初始化。然而,本着问题的精神,设计语言规则的基本原理是什么,所以这种情况是复制列表初始化而不是直接列表初始化?

最佳答案

因为传递函数参数,不是直接列表初始化,而是copy-list-initialization ;只能调用非显式构造函数。

function( { arg1, arg2, ... } ) ; (7) 
  • copy-list-initialization (only non-explicit constructors may be called)

7) in a function call expression, with braced-init-list used as an argument and list-initialization initializes the function parameter

请注意,在 C++11 之前(即尽管有 C++11 功能列表初始化),按值将参数传递给函数总是重新记录为 copy initialization , 不是直接初始化。

关于c++ - 为什么在列表初始化函数参数时显式构造函数不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41181345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com