Theo N2628 liên quan đến c++0x, trình khởi tạo thành viên dữ liệu không tĩnh có thể bị ghi đè bởi các hàm tạo được xác định rõ ràng, nhưng có vẻ hơi mơ hồ về hàm tạo bản sao được xác định ngầm.Trong C++ 0x, các bộ khởi tạo thành viên dữ liệu không tĩnh có ghi đè lên hàm tạo bản sao ngầm không?
Đặc biệt, tôi đã nhận thấy rằng với phiên bản Apple clang 3.0, hành vi khác nhau tùy thuộc vào việc cấu trúc (hay lớp) là một POD.
Chương trình sau trả về đầu ra "1", cho biết rằng hàm tạo bản sao bỏ qua phía bên tay phải và thay thế trình khởi tạo thành viên dữ liệu không tĩnh mới (trong ví dụ này, giá trị true boolean cho X :: a).
#include <iostream>
#include <string>
struct X
{
std::string string1;
bool a = true;
};
int main(int argc, char *argv[])
{
X x;
x.a = false;
X y(x);
std::cout << y.a << std::endl;
}
Tuy nhiên, gây nhầm lẫn, nếu bạn nhận xét ra chuỗi1:
// std::string string1;
sau đó hành vi hoạt động như tôi mong đợi (đầu ra là "0"), có lẽ vì không có mặc nhiên tạo sao chép constructor và do đó dữ liệu được sao chép.
Đặc tả C++ 0x có thực sự khuyên bạn nên cho phép hàm tạo bản sao được xác định rõ ràng để không phải là sao chép nội dung của phía bên tay phải không? Đó không phải là ít hữu ích và không trực quan? Tôi thấy chức năng khởi tạo thành viên không tĩnh khá thuận tiện, nhưng nếu đây là hành vi đúng, thì tôi sẽ tránh tính năng này một cách rõ ràng do hành vi khôn lanh và không trực quan của nó.
Vui lòng cho tôi biết tôi sai?
CẬP NHẬT: Lỗi này đã được sửa trong kho lưu trữ nguồn Clang. Xem này revision.
CẬP NHẬT: Lỗi này xuất hiện cố định trong phiên bản Apple clang 3.1 (thẻ/Apple/clang-318.0.45) (dựa trên LLVM 3.1svn). Phiên bản này của clang được phân phối như một phần của Xcode 4.3 cho Lion.
+1 cho nebulosity –