gpt4 book ai didi

c++ - 构造函数 : Why does 'explicit' prevent assignment construction?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:46 27 4
gpt4 key购买 nike

我有一个类 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 的构造和后续赋值形成对比。所以,我不太确定编译器遇到了什么问题。

我知道一个解决方案是删除第三个 ctor 前面的 explicit。不过,我宁愿先了解发生了什么......

编辑:
答案很好:ByteArray ba5 = "ABC"; 会被编译为 ByteArray ba5( ByteArray("ABC") ); --- 不是 ByteArray ba5("ABC"); 正如我所料。显而易见,但有时您需要有人指出。谢谢大家的回答!

为什么还要使用“explicit”?因为 unsigned intconst char * 之间存在歧义。如果我调用 ByteArray ba( 0 ); 两个 ctors 都可以处理它,所以我需要禁止隐式转换并将其设为显式

最佳答案

ByteArray ba5 = "ABC"; 是拷贝初始化,不是赋值。

把它想象成

ByteArray ba5(ByteArray("ABC"));

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

关于c++ - 构造函数 : Why does 'explicit' prevent assignment construction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381006/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com