xem xét mã này:Những thay đổi nào đối với C++ đã thực hiện công việc khởi tạo sao chép cho lớp với hàm tạo rõ ràng?
struct X{
explicit X(){}
explicit X(const X&){}
};
void foo(X a = X()){}
int main(){}
Sử dụng tiêu chuẩn C++ 14, cả GCC 7.1 và Clang 4,0 rejects mã, đó là những gì tôi mong đợi.
Tuy nhiên, sử dụng C++ 17 (-std=c++1z
), they both accept mã. Quy tắc nào đã thay đổi?
Đối với cả hai trình biên dịch để thể hiện hành vi tương tự này, tôi nghi ngờ đây là lỗi. Nhưng theo như tôi có thể nói, bản nháp mới nhất vẫn cho biết, đối số mặc định sử dụng ngữ nghĩa của sao chép khởi tạo. Một lần nữa, chúng tôi biết rằng các nhà xây dựng explicit
sẽ chỉ cho phép khởi tạo trực tiếp .
: dcl.fct.default/5; : class.conv.ctor/2
"Sao chép khởi tạo" không có nghĩa là bản sao sẽ được thực hiện. Ví dụ, 'struct A {int x; } a = {0}; 'cũng sử dụng khởi tạo sao chép' a' từ '{0}', nhưng không có bản sao nào được tạo. –
@ JohannesSchaub-litb. Cảm ơn, tôi hiểu. Ngoài ra, báo giá của bạn [* "tỷ lệ phần trăm được khởi tạo" * khái niệm] (https://stackoverflow.com/questions/38043319/how-does-guaranteed-copy-elision-through-simplified-value-categories-work?noredirect=1&lq = 1 # comment66236253_38043447) trong Nicol Bolas trả lời [ở đây] (https://stackoverflow.com/questions/38043319/how-does-guaranteed-copy-elision-through-simplified-value-categories-work?noredirect=1&lq=1), bao gồm cả câu trả lời của Nicol đã giúp tôi hiểu được sự thay đổi sâu rộng đối với 'prvalue' và hiện thực hóa tạm brouhaha. – WhiZTiM