简单来说,在两个构造函数中都用了explicit关键字时,隐式构造无效。(string a = "adg"或者 const string & a= "dsss"都是隐式构造的。)
若不加关键字,都有效。
深入理解:
https://www.jb51.net/article/54773.htm
然而当中的不能编译通过的例子在vs2019上是能够编译过的。
explicit关键字用于哪个构造函数,需要通过那个构造函数进行构造时,是不能进行复制初始化的。(也包括拷贝构造函数)
上图中,若是将拷贝构造函数的关键字改为private那么,main函数中的第一个语句也是不可行的。但可以正常运行(关于=12当作整体构造对象后由拷贝构造函数直接初始化这点有点存疑):
新标准发布之前,类是通过private关键字来声明拷贝构造函数和拷贝赋值运算符来阻止拷贝,现在用delete关键字来阻止,
我们来尝试:
这里vs2019编译运行竟然毫无错误,笔者将之归结于编译器的功劳。
总的来说:explicit关键字的作用是明确的,但是复制初始化到底是否会生成临时变量且调用拷贝构造函数,这个要看编译器的实现。(上面注释的将=12作为一个整体,这只是一个猜想,大概率是不对的:这种情况,vs2019编译器应该不会调用拷贝构造函数,直接调用构造函数,但是在形式上,它是复制初始化,explicit会阻止复制初始化)。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
c++primer:
再看下面的内容:
重新来看这个例子:
这个例子没有报错且正常运行,但是有复制初始化,就要调用拷贝构造函数或者移动构造函数,这里拷贝构造函数无法访问,且并没有移动构造函数,那么为什么会这样:
参c++文档(cppreference.com):复制消除