Tôi đã viết một số mã S s;
... s = {};
, hy vọng nó sẽ kết thúc giống như S s = {};
. Tuy nhiên nó không. Ví dụ sau tái tạo các vấn đề:Độ phân giải quá tải: gán dấu ngoặc rỗng
#include <iostream>
struct S
{
S(): a(5) { }
S(int t): a(t) {}
S &operator=(int t) { a = t; return *this; }
S &operator=(S const &t) = default;
int a;
};
int main()
{
S s = {};
S t;
t = {};
std::cout << s.a << '\n';
std::cout << t.a << '\n';
}
Đầu ra là:
5
0
Câu hỏi của tôi là:
- Tại sao
operator=(int)
chọn ở đây, thay vì "mơ hồ" hoặc một trong những khác ? - Có cách giải quyết gọn gàng, không thay đổi
S
không?
Mục đích của tôi là s = S{};
. Viết s = {};
sẽ thuận tiện nếu nó hoạt động. Tôi hiện đang sử dụng s = decltype(s){};
tuy nhiên tôi muốn tránh lặp lại loại hoặc tên biến.
'{}' to 'int' là chuyển đổi nhận dạng ([\ [over.ics.list \]/9] (http://eel.is/c++draft/over.ics.list#9)). '{}' đến 'S' là một chuyển đổi do người dùng định nghĩa ([\ [over.ics.list \]/6] (http://eel.is/c++draft/over.ics.list#6)). Tôi thề tôi đã thấy một câu hỏi rất giống nhau ngày hôm qua ... –
@ T.C. nếu vậy, tôi đoán tôi có thể đã tiết kiệm cho mình một số thời gian phát triển bằng cách đọc thêm câu hỏi ngày hôm qua! –
Tôi dường như đã phạm sai lầm tương tự ở nhiều nơi trong mã của tôi ... ví dụ: Tôi thường sử dụng 'void clear() {* this = {}; } 'với mục đích khôi phục một đối tượng thành trạng thái khởi tạo giá trị của nó –