std::string x(x);

这在我的编译器上崩溃得很严重。这是否意味着我应该测试 this != &that 在我自己的复制构造函数中,或者我可以假设没有客户会如此愚蠢吗?

有帮助吗?

解决方案

用自身初始化某些东西是未定义的行为,这甚至可能意味着一旦调用它,您以后甚至无法检测到它。假设编译器检测到它并且出于恶意生成鼻恶魔的程序集,而不是对您的复制构造函数的调用?

在实践中,您可以假设客户并不那么愚蠢,如果他们是这样,那么调试并解决问题就是他们的责任。

其他提示

您不应该对测试代码,试图崩溃严重。请参见空引用的。它说

  

“就像你必须假定一个非空指针是有效的,你必须假定一提的是有效的,你必须在你的同胞程序员的信心。”

我想补体

  

...你必须假设的副本的源是有效的。

如果您的“修复”的情况下,为这个做什么?

string x = string(x);

这代码是不正确的根据标准,它没有任何意义进行检查,并可能发生的最好的事情是一个快速的故障,使用户能够纠正他们的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top