为了说明这个问题,让我们考虑这两个简单的定义,Bar
是一个用户类型,带有来自int的显式构造函数:
struct Bar
{
explicit Bar(int a)
{}
};
void f(Bar)
{}
现在,正如cppreference所述:
direct-list-initialization(显式和非显式) 构造函数被认为是)
我们可以通过这种方式初始化实例
Bar b1{5};
然而,这是以这种方式调用函数的编译错误
f({5});
它仍然看起来像Bar
f
void P (const int A [][10])
{
}
int main(void)
{
int A[10][10];
P(A);
return 0;
}
参数的直接列表初始化,加上一个人可能会争辩说明在参数周围使用括号使它明确。
禁止对列表初始化函数参数使用显式构造函数的理由是什么?
链接页面的确表明在这种情况下这不是直接列表初始化。然而,根据问题的精神,设计语言规则的理由是什么,所以这个案例是copy-list-init而不是direct-list-init?
答案 0 :(得分:1)
因为传递函数参数,它不是直接列表初始化,而是copy-list-initialization;只能调用非显式构造函数。
function( { arg1, arg2, ... } ) ; (7)
- copy-list-initialization(只能调用非显式构造函数)
7)在函数调用表达式中,使用braced-init-list作为 参数和列表初始化初始化函数参数
请注意,在C ++ 11之前(即尽管C ++ 11特性列表初始化),通过值将参数传递给函数始终被重新标记为copy initialization,而不是直接初始化。