为了说明问题,让我们考虑一下这两个简单的定义, Bar
是一种用户类型,具有int:
struct Bar
{
explicit Bar(int a)
{}
};
void f(Bar)
{}
现在,正如CPPReference所说:
直接列表限制(显式和非义务 构造函数被认为)
我们可以以这种方式初始化一个实例
Bar b1{5};
但是,这是以这种方式调用功能
的汇编错误 f({5});
它仍然看起来像f
的Bar
参数的直接列表初始化,再加上一个人可以说,明确使用围绕参数的括号明确说明...显式。
不允许使用列表 - 定位函数参数的显式构造函数的理由?
编辑
链接的页面确实在说在这种情况下这不是直接列表限制。然而,本着问题的精神,设计语言规则的理由是什么,所以这种情况是复制名单,而不是直接列表?
,因为对于传递函数参数,它不是直接列表initialization,而是复制列表initialization;只能调用非明显的构造函数。
function( { arg1, arg2, ... } ) ; (7)
- 复制列表限制(只能称为非明确构造函数)
7)在函数调用表达式中,用布拉维 - 列表用作 参数和列表限制初始化函数参数
请注意,在C 11之前(即,尽管C 11功能列表初始化),将参数传递给函数按值始终作为复制初始化,而不是直接初始化。