Các vấn đề cụ thể nào có thể tránh được với các hạn chế được quy định tại khoản này
12.7p3
(xem phần đầu của đoạn bên dưới)?Liên quan đến đoạn 12.7p3 trong tiêu chuẩn C++, tôi có các câu hỏi sauTrong ví dụ được hiển thị trong
12.7p3
(xem bên dưới) tại saoX(this)
được xem là đã xác định? Có phải vìX
không nằm trong đường dẫnE C D B A
?struct A { }; struct B : virtual A { }; struct C : B { }; struct D : virtual A { D(A*); }; struct X { X(A*); }; struct E : C, D, X { E() : D(this), // undefined: upcast from E* to A* // might use path E* - D* - A* // but D is not constructed // D((C*)this), // defined: // E* - C* defined because E() has started // and C* - A* defined because // C fully constructed X(this) { // defined: upon construction of X, // C/B/D/A sublattice is fully constructed } };
Hãy tìm thấy bên dưới bắt đầu đoạn
12.7p3
:
Để rõ ràng hoặc ngầm chuyển đổi một con trỏ (một glvalue) đề cập đến một đối tượng của lớp X để một con trỏ (tham khảo) cho một cơ sở trực tiếp hoặc gián tiếp lớp B cơ sở X, việc xây dựng X và xây dựng tất cả của các căn cứ trực tiếp hoặc gián tiếp của nó trực tiếp hoặc gián tiếp lấy được từ B sẽ bắt đầu phá hủy các lớp này chưa hoàn thành, nếu không kết quả chuyển đổi sẽ không được xác định là hành vi không xác định.
Là nó đúng để nói rằng các thiết lập của tất cả các căn cứ trực tiếp và gián tiếp của X
, nêu trên không bao gồm B
, và vì điều này mã dưới đây được xác định rõ, dù thực tế là Base
là một trực tiếp cơ sở của Derived
và chưa bắt đầu?
struct Base{ Base(Base*); };
struct Derived : Base {
Derived() : Base(this) {};
};
+1 chỉ dành cho nỗ lực hiếm khi cố gắng tìm câu trả lời trong tiêu chuẩn. – PlasmaHH
@PlasmaHH một ví dụ điển hình về đạo đức làm việc lành mạnh theo kiểu cũ, tìm kiếm câu trả lời trong kinh thánh thay vì độc quyền với rất kinh nghiệm. – TemplateRex