2016-10-06 15 views
5

Một tiêu chuẩn bố trí lớp được định nghĩa trong [lớp]/7 trong C++ 14, như sau (nhấn mạnh là của tôi):Định nghĩa của lớp tiêu chuẩn bố trí trong C++ 14

Một tiêu chuẩn -layout lớp là một lớp rằng:

  • (7,1) - không có thành viên dữ liệu tĩnh không của loại phi tiêu chuẩn bố trí lớp (hoặc mảng các loại như vậy) hoặc tham khảo,
  • (7.2) - không có chức năng ảo (10.3) và không có lớp cơ sở ảo (10.1),
  • (7.3) - có sự kiểm soát cùng truy cập (khoản 11) cho tất cả không tĩnh thành viên dữ liệu,
  • (7.4) - không có lớp cơ sở phi tiêu chuẩn bố trí,
  • (7.5) - hoặc không có thành viên dữ liệu không tĩnh trong nguồn gốc nhất lớp nhiều nhất là một lớp cơ sở với các thành viên dữ liệu tĩnh không, hoặc có không lớp cơ sở với các thành viên dữ liệu không tĩnh, và
  • (7.6) - không có các lớp cơ sở cùng loại với thành viên dữ liệu không phải là không tĩnh đầu tiên.

mối quan tâm của tôi là liên quan đến viên đạn (7.5): làm thế nào là nó có thể có không thành viên dữ liệu không tĩnh trong lớp có nguồn gốc nhất và đồng thời có một lớp cơ sở với các dữ liệu không tĩnh các thành viên?

Nói cách khác, không phải là thành viên dữ liệu không tĩnh của lớp cơ sở, cũng là thành viên dữ liệu không tĩnh của lớp có nguồn gốc cao nhất?

+2

Hãy suy nghĩ về các vật thể như những con búp bê Matruska Nga. Đối tượng xuất phát nhiều nhất là vỏ ngoài của con búp bê. Trong khi đối tượng cơ bản nhất là cốt lõi của nó. – 101010

+0

Cuối cùng, chúng là những con búp bê khác nhau. – 101010

+0

Bạn có nghĩa là búp bê Matryoshka? – bipll

Trả lời

8

Có, đây là lỗi trong C++ 14, cụ thể là CWG 1813. Mặc dù nó có thể được sửa chữa bằng cách đọc "thành viên dữ liệu không tĩnh" chỉ tham chiếu trực tiếp (không được thừa kế) thành viên dữ liệu không tĩnh (có thể là cần thiết ở nơi khác), sửa chữa đã chọn đã thay thế ngôn ngữ bạn tìm thấy có vấn đề như sau:

một lớp học tiêu chuẩn bố trí là một lớp học: [...]

  • có tất cả các thành viên dữ liệu và bit lĩnh vực trong lớp và các lớp cơ sở của nó không tĩnh được khai báo đầu tiên trong cùng một lớp, [...]

Đây là một chút khó khăn để có được quyền; có một số đề kháng với các ý tưởng xem xét các thành viên được thừa kế như các thành viên của lớp được thừa kế, mặc dù [class.derived] có:

[...] Trừ redeclared trong lớp có nguồn gốc, thành viên của một lớp cơ sở cũng được coi là thành viên của lớp dẫn xuất. Các thành viên của một lớp cơ sở không phải là các nhà xây dựng được cho là được thừa hưởng bởi lớp dẫn xuất. [...]

Mặc dù vậy, một số nơi cả trực tiếp và thừa hưởng không tĩnh thành viên dữ liệu nhằm mục đích được coi là đặc biệt gọi ra được thừa hưởng các thành viên dữ liệu, ví dụ cũng trong [lớp] (sau độ phân giải CWG 1672):

8,6 - một loại tổng hợp hoặc công đoàn trong đó bao gồm một trong các loại nói trên giữa các yếu tố của nó hoặc các thành viên dữ liệu không tĩnh (bao gồm, đệ quy, một yếu tố hoặc thành viên không tĩnh dữ liệu của một subaggregate hoặc công đoàn chứa) ,

Hoặc trong [basic.lval]:

7,8 - Nếu X là một loại lớp phi công đoàn, tập hợp M (X) là rỗng nếu X không có người (có thể thừa hưởng (khoản 10)) thành viên dữ liệu không tĩnh; [...]

Trong khi đó, ở nhiều nơi "thành viên" phải được đọc là chỉ đề cập đến các thành viên trực tiếp có ý nghĩa; để bắt đầu và chỉ xem xét các thành viên dữ liệu không tĩnh (không phải là hàm thành viên), [expr.rel] /3.2, [expr.const] /5.1, [dcl.constexpr] /4.6, [class.mem]/17,/19, [đặc biệt]/5, [class.ctor] /4.3, /4.4, /4.10, /4.12, [class.dtor] /5.6, [class.base.init]/2, /13.3, [class. copy] /12.2, /12.4, /18.2, /25.2, /25.4, /26.3,/27, [except.spec] /15.1.1.1, /15.2, /15.3 là tất cả những nơi mà "thành viên dữ liệu không tĩnh" có thể hoặc phải có tiền tố "trực tiếp".

Mặt khác, ở một số nơi (ví dụ: trong [sửa đổi] lớp học hoặc trong [class.copy] /23.2-23.3,/28) "thành viên" được ngầm đưa vào để bao gồm các thành viên được kế thừa, do đó, đó là chút lộn xộn.

+0

'Không, thành viên dữ liệu không tĩnh của một lớp cơ sở không được coi là thành viên dữ liệu không tĩnh của lớp dẫn xuất.' Có báo giá cụ thể cho điều này trong tiêu chuẩn không? – Alexander

+0

'7.8 - Nếu X là một loại nhóm không kết hợp, tập hợp M (X) trống nếu X không có (có thể kế thừa (khoản 10)) thành viên dữ liệu không tĩnh;' Tôi không thể tìm thấy điều này trong C + +14. – Alexander

+0

@Alexander là [CWG 1672] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1672). – ecatmur

Các vấn đề liên quan