我有一个类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 );
}
虽然几乎所有东西都能正常工作,但通过赋值构造ByteArray
会导致编译错误。
ByteArray ba1( 5 ); // works
ByteArray ba2( ba1 ); // works
ByteArray ba3( "ABC" ); // works
ByteArray ba4; // works
ba4 = "ABC"; // works
ByteArray ba5 = "ABC"; // <<<----- doesn't compile!
编译器出现了一个“无法将'const char *'转换为'ByteArray'”的错误提示。然而,“赋值构造函数”应该与复制构造函数相同,即
ba5
行应该像ba3行一样编译——与ba4
及其后续赋值的构造方式不同。因此,我不太确定编译器遇到了什么问题。
我知道,解决方案是删除第3个构造函数前面的explicit
。但我宁愿先理解发生了什么……
编辑:
回答说明得很好:ByteArray ba5 = "ABC";
会被编译为ByteArray ba5( ByteArray("ABC") );
——而不是像我以为的那样编译为ByteArray ba5("ABC");
。显而易见,但有时你需要别人指出。谢谢大家的答案!
为什么要使用'explicit'呢?因为unsigned int
和const char *
之间存在歧义。如果我调用ByteArray ba(0);
,那么两个构造函数都能处理它,所以我需要禁止隐式转换并使其成为explicit
。
explicit
,所以需要显式调用它。 - Mohit Jain