Tôi đã xem qua các câu hỏi phỏng vấn cho một vị trí phát triển cơ sở C++. Câu hỏi là (quote):Sửa đổi đối tượng liên tục
Mã sau đây đúng?
struct Foo
{
int i;
void foo (void) const
{
Foo* pointer = const_cast<Foo*>(this);
pointer->i = 0;
}
};
Tôi sẽ trả lời:
Mã chính nó là hợp lệ theo quy định của C++ 03 và C++ 11 tiêu chuẩn và sẽ biên dịch thành công. Nhưng nó có thể gọi một hành vi không xác định trong khi gán con trỏ-> i = 0; nếu trường hợp của lớp mà trên đó foo() đang được gọi là khai báo là const.
Tôi có nghĩa là mã sau đây sẽ biên dịch thành công và dẫn đến hành vi không xác định.
struct Foo
{
int i;
Foo (void)
{
}
void foo (void) const
{
Foo* pointer = const_cast<Foo*>(this);
pointer->i = 0;
}
};
int main (void)
{
Foo foo1;
foo1.foo(); // Ok
const Foo foo2;
foo2.foo(); // UB
return 0;
}
Câu trả lời của tôi có chính xác hoặc thiếu gì đó không? Cảm ơn bạn.
Có, điều đó là chính xác. –
"Đúng" là một từ mơ hồ. Đó là * cũng được hình thành *, có nghĩa là nó không có lỗi chẩn đoán, nhưng (như bạn nói) có thể gây ra hành vi không xác định. –
IMO từ một POV thiết kế nó không phải là "đúng" vì 'const Foo foo; foo.foo(); 'không được UB. Sử dụng thành viên 'mutable' sẽ tốt hơn. – StackedCrooked