Tạo đối tượng tiềm ẩn không xác định


9

Do P0593 Việc tạo các đối tượng ngầm cho thao tác đối tượng mức thấp đã được chấp nhận, giờ đây các đối tượng có thể được tạo hoàn toàn trong C ++ 20.

Cụ thể, từ ngữ được đề xuất cho phép cho phép các hoạt động nhất định (như std::malloc) tự động tạo và bắt đầu thời gian tồn tại của các đối tượng thuộc một số loại nhất định, được gọi là các kiểu sống trọn đời , nếu giới thiệu các đối tượng đó sẽ khiến chương trình có hành vi không xác định khác có hành vi xác định. Xem [intro.object] / 10 .

Dự thảo bây giờ tuyên bố thêm rằng nếu có nhiều bộ đối tượng như vậy có thể được tạo ra hoàn toàn để đưa ra hành vi được xác định của chương trình, thì không xác định được bộ nào trong số các bộ này được tạo. (Câu liên quan dường như không có trong bản sửa đổi đề xuất cuối cùng mà tôi có thể truy cập, R5, nhưng nằm trong dự thảo cam kết.)

Có thực sự có một chương trình mà sự lựa chọn này của bộ đối tượng được tạo ngầm có thể quan sát được không? Nói cách khác, có một chương trình với hành vi được xác định, nhưng không xác định, thông qua quy tắc mới này, sao cho có thể suy ra từ đầu ra tập hợp các loại đối tượng ẩn (trong số nhiều hơn một đối tượng có thể) được tạo ra?

Hay câu này chỉ đơn thuần là để làm rõ việc thực hiện chương trình trên máy trừu tượng (không có tác động quan sát được)?


2
(OT) nếu một đối tượng được tạo ngầm là một int, chúng ta có thể gọi nó là "int ngầm" không?
MM

Có vẻ như không rõ liệu sự lựa chọn của yếu tố từ tập hợp không xác định phải được biết tại điểm của malloc
MM

@MM Tôi giả định rằng lựa chọn tập hợp được coi là xảy ra một cách trừu tượng như là một lựa chọn duy nhất cho toàn bộ chương trình thực hiện bên ngoài luồng thực thi, nhưng với việc tạo ra xảy ra trực tiếp tại hoạt động được đề cập (ví dụ std::malloc), nếu không, bạn gặp vấn đề với định nghĩa được đệ quy tùy thuộc vào tương lai.
quả óc chó

Tôi đã thực hiện một câu hỏi khác về chủ đề đó, stackoverflow.com/questions/60627249 . Tất nhiên một số hệ quả nữa xuất hiện trong đầu nhưng một câu hỏi tại một thời điểm ..
MM

Đề xuất tuyên bố rằng không thể phân biệt được, điều này rất quan trọng vì không có cách nào để lựa chọn được thực hiện chính xác, chỉ tối ưu hóa để tránh điều đó sẽ có hiệu lực ( rất nghiêm ngặt).
Davis Herring

Câu trả lời:


9

Hãy lấy ví dụ trong tiêu chuẩn và thay đổi nó một chút:

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
  // The call to std::malloc implicitly creates an object of type X
  // and its subobjects a and b, and returns a pointer to that X object
  // (or an object that is pointer-interconvertible ([basic.compound]) with it),
  // in order to give the subsequent class member access operations
  // defined behavior.
  X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
  p->a = 1;
  p->b = 2;
  return p;
}

Trước đây, chỉ có một bộ đối tượng hợp lệ có thể được tạo hoàn toàn trong bộ lưu trữ đó - nó phải chính xác là một X. Nhưng bây giờ, chúng tôi có bộ lưu trữ cho hai Xs, nhưng chỉ ghi vào một trong số chúng và không có gì trong chương trình này chạm vào phần còn lại của các byte. Vì vậy, có rất nhiều bộ đối tượng khác nhau có thể được tạo hoàn toàn - có thể hai Xs, có thể một Xvà hai ints, có thể một Xvà tám chars, ...

Không thể quan sát được bộ nào được tạo, bởi vì nếu có bất kỳ quan sát thực tế nào, điều đó sẽ làm giảm khả năng chỉ những bộ hợp lệ. Nếu chúng ta làm một cái gì đó như thế p[1]->a = 3thì vũ trụ của các khả năng sụp đổ xuống chỉ còn một với hai Xs.

Nói cách khác, nhiều bộ đối tượng được tạo ngầm chỉ có thể khi không có đủ các quan sát trong chương trình để phân biệt tính hợp lệ của chúng. Nếu có một cách để phân biệt, thì theo định nghĩa, tất cả chúng sẽ không hợp lệ.


Đây chỉ là dự đoán của tôi.
Barry

Vì vậy, tôi cho rằng đơn giản là không có cách nào để phân biệt / quan sát sự tồn tại hoặc không tồn tại của các đối tượng thuộc các kiểu sống ẩn khác nhau mà không có hành vi không xác định. Trong trường hợp đó, đối với tôi, đó là cách sử dụng duy nhất " hành vi không xác định " trong tiêu chuẩn thực sự không thể dẫn đến các kết quả quan sát khác nhau.
quả óc chó

1
Hoặc nếu truy cập chỉ là qua glvalues loại [cv] char, unsigned charhoặc std::byte? Một đối tượng của bất kỳ loại có thể sao chép tầm thường cũng có thể tồn tại ở đó, tôi đoán?
aschepler

2
Ngay cả trong ví dụ ban đầu, cũng có thể tạo một đối tượng mảng cùng với một Xđối tượng.
TC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.