我最近了解了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!
这个编译!
但是我无法看到任何可能需要这种语法的相应场景。
任何人都可以提供一个最小的例子吗?
答案 0 :(得分: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
- 如果初始化程序是(非括号内的)braced-init-list,则 对象或引用是列表初始化的(8.5.4)。
8.5.4 / 3
对象或类型T的引用的列表初始化定义为 如下:......
否则,如果T是类类型,则考虑构造函数。该 列举了适用的构造函数,并选择最佳构造函数 通过重载决议(13.3,13.3.1.7)。如果缩小 转换(见下文)是转换任何参数所必需的, 该计划格式不正确。