假设有以下类:
class Example
{
public:
...
Example& operator=(const Example& rhs);
...
private:
other_type *m_content;
size_t m_content_size;
}
Example& Example::operator=(const Example& rhs)
{
if (this != &rhs)
{
delete m_content;
m_content = nullptr;
m_content = getCopiedContent(rhs);
}
return *this;
}
我知道这不是实现operator=
的最佳方法,但这是有意为之的,因为我的问题与以下两行代码有关:
m_content = nullptr;
m_content = getCopiedContent(rhs);
编译器可能会优化掉m_content = nullptr;
,即使getCopiedContent
没有被定义为throw()
或noexcept
:
other_type* getCopiedContent(const Example& obj);
一方面,编译器可能会假设在m_content = nullptr;
之后,如果我用getCopiedContent
的返回值覆盖了m_content
的值,它可能会优化掉整个m_content = nullptr;
表达式。另一方面,如果编译器将其优化掉并且getCopiedContent
抛出异常,m_content
将包含一个无效值。
C++标准文件是否对这种情况做出了规定?