6

我最近了解了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!

这编译!

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

谁能提供一个最小的例子?

4

1 回答 1

11

如果您的构造函数是显式的并且该类不提供非显式构造函数initializer_list<T>,那么您不能复制列表初始化实例。

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

简单的现场示例

#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

— 如果初始值设定项是(无括号的)大括号初始化列表,则对象或引用是列表初始化的(8.5.4)。

8.5.4/3

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

否则,如果 T 是类类型,则考虑构造函数。枚举适用的构造函数,并通过重载决议(13.3、13.3.1.7)选择最佳构造函数。如果需要缩小转换(见下文)来转换任何参数,则程序格式错误。

于 2014-12-25T08:51:14.330 回答