显式非单参数构造函数

axe*_*axe 7 c++ constructor explicit-constructor

任何人都可以解释为什么非单参数构造函数标记为显式编译?据我所知,这里绝对是无用的关键字,为什么这个编译没有错误?

class X
{
public:
    explicit X(int a, int b) { /* ... */}
};
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 10

在C++ 03中,在这种特殊情况下,标记两个参数构造函数是没有意义的explicit.但这里有意义:

explicit X(int i, int j=42);
Run Code Online (Sandbox Code Playgroud)

因此,标记两个参数构造函数explicit不一定是错误.

在C++ 11中,使用explicit会阻止你这样做:

X x = {1,2};
Run Code Online (Sandbox Code Playgroud)

  • @axe是的,我同意,也许语言的规则可能更加严格.问题是,是否值得为规则增加更多复杂性以获得潜在利益.现在,快进到2011和C++ 11,并且`explicit`*确实*在多参数构造函数中起作用.所以有人可能会说这条规则最初没有更严格,这很幸运. (5认同)

Bat*_*eba 7

不完全正确.

在C++ 11中,可以使用大括号初始化隐式转换具有多个参数的构造函数.