-2 c++
在查看同事的代码时,我发现了一个有趣的行为。他声明了一个公共操作符=,但没有定义它,但代码似乎使用了默认的复制构造函数。好奇,我尝试了一下,发现当我尝试声明而不定义复制构造函数时,类似的事情会导致编译器错误。我试过的代码示例 -
class Classy
{
public:
Classy& operator =(const Classy&); // compiles, seems to use default copy CTor
Classy(const Classy&); // compiler error
int a, b;
};
int main()
{
Classy Foo;
Classy Baz = Foo; // compiles, seems to use default copy CTor
Classy Bar(Foo); // compiler error
}
Run Code Online (Sandbox Code Playgroud)
为什么 operator= 似乎在没有相应定义的情况下工作,但复制构造函数却没有?
小智 5
尽管=,Classy Baz = Foo;是副本,而不是作业;所以你丢失的赋值运算符永远不会被调用。
请注意,对于您所展示的类,没有理由指定复制或分配;编译器提供的默认值可以正常工作。如果你想说清楚,请使用= default:
struct Classy
{
Classy& operator =(const Classy&) = default;
Classy(const Classy&) = default;
Classy() = default;
int a, b;
};
Run Code Online (Sandbox Code Playgroud)
相反,如果您真的想摆脱运算符而不定义它,请使用=delete:
struct Classy
{
Classy& operator =(const Classy&) = delete; // no assignment
Classy(const Classy&) = delete; // no copy
Classy() = default;
int a, b;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |