ctor:为什么'明确'阻止分配建设?

Rob*_*bin 5 c++ constructor

我有一个ByteArray像这样定义的类:

class ByteArray
{
public:
    explicit ByteArray( unsigned int uiSize = 0 );
    explicit ByteArray( const char * ucSource );
    ByteArray( const ByteArray & other );

    ByteArray & operator=( const char * ucSource );
    ByteArray & operator=( const ByteArray & other );
}
Run Code Online (Sandbox Code Playgroud)

虽然几乎所有东西都可以工作,但是构建一个ByteArrayby assign不会编译

ByteArray ba1( 5 );     // works
ByteArray ba2( ba1 );   // works
ByteArray ba3( "ABC" ); // works
ByteArray ba4;          // works
ba4 = "ABC";            // works
ByteArray ba5 = "ABC";  // <<<----- doesn't compile!
Run Code Online (Sandbox Code Playgroud)

编译器给我一个不能将'const char*'转换为'ByteArray'.
但是,"赋值构造函数"应该与复制构造函数相同,即.该ba5行应该像ba3行一样编译---与构造ba4和后续赋值形成对比.所以,我不太清楚编译器有什么问题.

我知道解决方案是删除explicit第3个ctor前面.我宁愿先了解发生了什么,但......

编辑:
答案很好地说明:ByteArray ba5 = "ABC";将编译为ByteArray ba5( ByteArray("ABC") );--- ByteArray ba5("ABC");不像我想的那样.很明显,但有时你需要有人指出来.谢谢大家的回答!

为什么要使用'明确'呢?因为unsigned int和之间存在歧义const char *.如果我打电话给ByteArray ba( 0 );两个ctors都能够处理,所以我需要禁止隐式转换并制作它explicit.

Luc*_*ore 9

ByteArray ba5 = "ABC"; 是复制初始化,而不是赋值.

把它想象成

ByteArray ba5(ByteArray("ABC"));
Run Code Online (Sandbox Code Playgroud)

或者至少那是编译器看到的.由于explicit构造函数的属性,它在您的情况下是非法的 - 编译器希望使用该转换构造函数来执行复制初始化,但它不能,因为您没有明确地使用它.