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

时间:2016-12-16 09:43:02

标签: c++ c++11 parameter-passing language-lawyer list-initialization

为了说明这个问题,让我们考虑这两个简单的定义,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?

1 个答案:

答案 0 :(得分:1)

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

function( { arg1, arg2, ... } ) ; (7) 
     
      
  • copy-list-initialization(只能调用非显式构造函数)
  •   
     

7)在函数调用表达式中,使用braced-init-list作为   参数和列表初始化初始化函数参数

请注意,在C ++ 11之前(即尽管C ++ 11特性列表初始化),通过值将参数传递给函数始终被重新标记为copy initialization,而不是直接初始化。