cuốn sách gpt4 ai đã làm

Chuyển đổi con trỏ thành con trỏ const và quay lại kiểu nguyên thủy không xác định?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 08:24:42 hai mươi bốn 4
mua khóa gpt4 Nike

Tôi biết rằng việc truyền một con trỏ const sang loại không phải là const có thể là hành vi không xác định, nhưng nếu ban đầu con trỏ không phải là const thì sao?

int i = 0;
int * pi = &i;
const int * const_pi = const_cast(pi);
int * non_const_pi = const_cast(const_pi);
*non_const_pi = 0;
*non_const_pi = 1;
int j = *non_const_pi;

Có hành vi không xác định nào không? Nếu vậy, chúng xảy ra ở đâu? Trình biên dịch có thể giả sử non_const_pi Nó có được chuyển đổi từ con trỏ hằng và không thực hiện sửa đổi nào không?

câu trả lời hay nhất

Tôi biết việc truyền con trỏ const sang loại không phải const có thể là hành vi không xác định.

Đây là một sự hiểu lầm.

Con trỏ truyền hằng không bao giờ dẫn đến hành vi không xác định. sự hủy bỏ thông qua const_cast thu được không const con trỏ - ý chí const Con trỏ trỏ tới const Đối tượng không phải là hành vi không xác định nếu đối tượng ban đầu được sử dụng ở chế độ chỉ đọc. Đây là hành vi không xác định nếu bạn cố gắng ghi vào đối tượng.

int const i = 10;
int const* p1 = &i;
int* p2 = const_cast(p1); // OK.
std::cout << *p2; // Vẫn ổn.
*p2 = 20; // Không ổn.

Với điều này, đoạn mã thứ hai của bạn hoàn toàn ổn. Không có hành vi không xác định vì đối tượng ban đầu không const sự vật.

từ Tiêu chuẩn, Phần 5.2.11, Biểu thức/Const :

Kết quả của một con trỏ const_cast đề cập đến đối tượng ban đầu.

Chuyển đổi con trỏ thành con trỏ const và quay lại kiểu nguyên thủy không xác định? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/55428187/

hai mươi bốn 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress