为什么在列表initialization函数参数时,显式构造函数不匹配



为了说明问题,让我们考虑一下这两个简单的定义, Bar是一种用户类型,具有int:

的显式构造函数
struct Bar
{
    explicit Bar(int a)
    {}
};
void f(Bar)
{}

现在,正如CPPReference所说:

直接列表限制(显式和非义务 构造函数被认为)

我们可以以这种方式初始化一个实例

Bar b1{5};

但是,这是以这种方式调用功能

的汇编错误

f({5});

它仍然看起来像fBar参数的直接列表初始化,再加上一个人可以说,明确使用围绕参数的括号明确说明...显式。

不允许使用列表 - 定位函数参数的显式构造函数的理由?

编辑

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

,因为对于传递函数参数,它不是直接列表initialization,而是复制列表initialization;只能调用非明显的构造函数。

function( { arg1, arg2, ... } ) ; (7) 
  • 复制列表限制(只能称为非明确构造函数)

7)在函数调用表达式中,用布拉维 - 列表用作 参数和列表限制初始化函数参数

请注意,在C 11之前(即,尽管C 11功能列表初始化),将参数传递给函数按值始终作为复制初始化,而不是直接初始化。

最新更新