Ý nghĩa chính xác của cụm từ "như thể" trong tiêu chuẩn là gì và nó hoạt động như thế nào khi người dùng có thể sửa đổi các phần riêng lẻ của hành vi."như thể" trong tiêu chuẩn ngôn ngữ
Câu hỏi đặt ra là liên quan đến tiêu chuẩn C++ khi nói về phiên bản chưa phát hành của operator new
. 18.4.1.1/7 đọc (tôi nhấn mạnh):
Đây là phiên bản nothrow của nhà khai thác lợi nhuận mới một con trỏ được như thể mua từ các phiên bản bình thường.
Sự hiểu biết của tôi là "như thể" không yêu cầu triển khai cụ thể miễn là hành vi là phù hợp. Vì vậy, nếu operator new
được thực hiện như thế này (tôi biết đây không phải là một việc thực hiện phù hợp vì không có vòng lặp hoặc sử dụng các new_handler; nhưng tôi rút ngắn mà tập trung vào vấn đề của tôi):
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s)
{
void *p = malloc(s);
if (p == 0)
throw std::bad_alloc();
return p;
}
Sau đó, nó sẽ hợp pháp để viết phiên bản không giống như thế này:
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
return malloc(s);
}
Nhưng giả sử chương trình thay thế operator new
để sử dụng một số cấp phát khác. Liệu "như thể" có nghĩa là trình biên dịch phải tự động thay đổi hành vi của phiên bản không dùng để sử dụng cấp phát khác này? Nhà phát triển có bắt buộc phải thay thế cả phiên bản thuần tuý và không phải không?
http://www.gotw.ca/publications/mill15.htm http://www.gotw.ca/publications/mill16.htm –
Bản nháp mới nhất của C++ 0x đã thay đổi từ ngữ: "This nothrow phiên bản của toán tử new trả về một con trỏ thu được như thể có được từ phiên bản thông thường (có thể thay thế). Và hành vi mặc định đã thay đổi thành "Toán tử cuộc gọi mới (kích thước). Nếu cuộc gọi trả về bình thường, trả về kết quả của cuộc gọi đó. Nếu không, trả về một con trỏ rỗng." –