【发布时间】:2017-05-02 01:41:07
【问题描述】:
为了说明这个问题,让我们考虑一下这两个简单的定义,Bar 是一个用户类型,具有来自 int 的显式构造函数:
struct Bar
{
explicit Bar(int a)
{}
};
void f(Bar)
{}
现在,正如cppreference 所说:
直接列表初始化(显式和非显式 构造函数被考虑)
我们可以这样初始化一个实例
Bar b1{5};
然而,以这种方式调用函数会出现编译错误
f({5});
它仍然天真地看起来像直接列表初始化 f 的 Bar 参数,而且有人可能会争辩说,在参数周围显式使用大括号使其......显式。
禁止对列表初始化函数参数使用显式构造函数的理由是什么?
编辑
链接页面确实是在说在这种情况下这不是直接列表初始化。然而,本着问题的精神,设计语言规则的基本原理是什么,所以这种情况是复制列表初始化而不是直接列表初始化?
【问题讨论】:
-
f({5})是复制列表初始化。 -
@T.C.你是对的,这是问题中链接的页面中的第 7 点)。
标签: c++ c++11 parameter-passing language-lawyer list-initialization