Làm thế nào để sao chép (hoặc trao đổi) các đối tượng của một type có chứa các thành viên là tài liệu tham khảo hoặc XD?


0 Phiếu
Đã hỏi 07/4/2016 bởi Yvx9948b (108,690 điểm)
Vấn đề tôi đang cố gắng để address phát sinh với việc các thùng chứa như một std::vector đối tượng chứa tài liệu tham khảo và const data thành viên:
struct Foo;
struct Bar {
  Bar (Foo & foo, int num) : foo_reference(foo), number(num) {}
private:
  Foo & foo_reference;
  const int number;
  // Mutable member data elided
};
struct Baz {
  std::vector<Bar> bar_vector;
};
, điều này sẽ không làm việc như là-là bởi vì mặc định gán operator cho class Foo không thể được xây dựng do các tài liệu tham khảo member foo_reference và const member number. Một giải pháp là để thay đổi foo_reference mà pointer một và loại bỏ từ khóa const. Điều này tuy nhiên sẽ mất lợi thế của tài liệu tham khảo trên con trỏ, và rằng member const thực sự phải là const. Họ là private thành viên, vì vậy điều duy nhất mà có thể làm hại là mã của riêng tôi, nhưng tôi đã bắn mình trong bàn chân (hoặc cao hơn) với mã số của riêng tôi. Tôi đã nhìn thấy các giải pháp cho vấn đề này trên trang web tại form swap các phương pháp có vẻ như là chock đầy đủ của hành vi undefined dựa trên những kỳ quan của reinterpret_castconst_cast. Nó sẽ xảy ra những kỹ thuật xuất hiện để làm việc trên máy tính của tôi. Ngày hôm nay. Với một phiên bản đặc biệt của một trình biên dịch cụ thể. Ngày mai, hoặc với một trình biên dịch khác nhau? Những người hiểu biết. Tôi sẽ không sử dụng một giải pháp dựa trên hành vi của undefined . Liên quan đến câu trả lời trên stackoverflow: như vậy có cách nào để viết một method swap / constructor cho class như vậy mà không gọi undefined hành vi sao chép, hoặc tôi chỉ hơi say? chỉnh sửa chỉ cần để làm cho nó rõ ràng, tôi đã là khá nhận thức của giải pháp này:
struct Bar {
  Bar (Foo & foo, int num) : foo_ptr(&foo), number(num) {}
private:
  Foo * foo_ptr;
  int number;
  // Mutable member data elided
};
này một cách rõ ràng giúp loại bỏ ness const của number và các loại bỏ ness ngụ ý const của foo_reference. Đây không phải là giải pháp tôi sau. Nếu đây là giải pháp duy nhất-UB, vì vậy nó là. Tôi cũng khá nhận thức của giải pháp này:
void swap (Bar & first, Bar & second) {
    char temp[sizeof(Bar)];
    std::memcpy (temp, &first, sizeof(Bar));
    std::memcpy (&first, &second, sizeof(Bar));
    std::memcpy (&second, temp, sizeof(Bar));
}
và sau đó bằng văn bản chuyển nhượng operator bằng cách sử dụng bản sao và trao đổi. Điều này được xung quanh các tài liệu tham khảo và const vấn đề, nhưng nó là UB? (Tối thiểu là nó không sử dụng reinterpret_castconst_cast.) Một số elided mutable data là đối tượng có chứa std::vector s, do đó, tôi không biết nếu một bản sao cạn như thế này sẽ làm việc ở đây.

Xin vui lòng đăng nhập hoặc đăng ký để trả lời câu hỏi này.


ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...