何时为多参数构造函数使用显式说明符?

时间:2014-12-25 08:49:12

标签: c++ c++11 constructor explicit multiple-arguments

我最近了解了explicit说明符。

假设我们有:

f( W, W, W );

现在,如果我们这样做

f( 42, 3.14, "seven" );

编译器将尝试以下隐式转换:

f( W(42), W(3.14), W("seven") );

如果我们为W定义了匹配的构造函数,即:

W(int);
W(double);
W(std::string);

......它会成功。

但是,如果我们明确第一个:

explicit W(int);

...这会禁用隐式转换。

你现在必须写:

f( W(42), 3.14, "seven" );

即。它迫使你明确说明转换

现在回答问题:

可以写:

explicit W(int,int); // 2 arguments!

这个编译!

但是我无法看到任何可能需要这种语法的相应场景。

任何人都可以提供一个最小的例子吗?

1 个答案:

答案 0 :(得分:11)

如果构造函数是显式的,并且该类不提供使用initializer_list<T>的非显式构造函数,则无法复制列表初始化实例。

W w = {1,2}; // compiles without explicit, but not with

Simple live example

#include <iostream>

class A
{
public:
   explicit A(int, int) {}
};

class B
{
public:
    B(int, int) {}
};

int main()
{
   B b = {1,2};
   A a = {1,2};
}

标准引言:

8.5 / 16

  

- 如果初始化程序是(非括号内的)braced-init-list,则   对象或引用是列表初始化的(8.5.4)。

8.5.4 / 3

  

对象或类型T的引用的列表初始化定义为   如下:......

     

否则,如果T是类类型,则考虑构造函数。该   列举了适用的构造函数,并选择最佳构造函数   通过重载决议(13.3,13.3.1.7)。如果缩小   转换(见下文)是转换任何参数所必需的,   该计划格式不正确。