Giả sử lớp sau:C Tiềm năng ++ biên dịch tối ưu hóa có/không có/chức năng noexcept ném
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;
}
Tôi biết rằng đây không phải là cách tốt nhất để thực hiện operator=
nhưng đó là về mục đích, bởi vì câu hỏi của tôi là khoảng hai dòng:
m_content = nullptr;
m_content = getCopiedContent(rhs);
thể thể là trình biên dịch sẽ tối ưu hóa ra m_content = nullptr;
mặc dù getCopiedContent
không được định nghĩa là throw()
hoặc noexcept
:
other_type* getCopiedContent(const Example& obj);
Một mặt trình biên dịch có thể giả định rằng nếu ngay sau khi m_content = nullptr;
tôi ghi đè lên giá trị của m_content
với giá trị trả về của getCopiedContent
, nó có thể tối ưu hóa ra toàn bộ m_content = nullptr;
biểu thức. Mặt khác, nếu trình biên dịch tối ưu hóa nó và getCopiedContent
ném một ngoại lệ, m_content
sẽ chứa một giá trị không hợp lệ.
C++ có trạng thái chuẩn bất kỳ điều gì về trường hợp như vậy không?
Tóm tắt câu chuyện dài: Bạn có thể giả sử mã của bạn hoạt động chính xác như nó sẽ không có bất kỳ tối ưu hóa nào. Ngoại lệ duy nhất cho điều này là RVO và UB. –