8
struct S 
{ 
    int x; 
    int y; 
}; 

std::atomic<S> asd{{1, 2}}; // what should this be? This doesn't work 

Chỉnh sửa: Cả hai {{1, 2}}({1, 2}) hoạt động trong g ++, không hoạt động trong tiếng kêu vang. Có cách giải quyết nào cho tiếng kêu không?Khởi tạo đồng bộ cấu trúc nguyên tử?

+1

Tôi không thấy bất kỳ sự cố nào; người ta thậm chí không thể gán thủ công S cho con thú đó một cách thủ công. Nhưng hãy suy nghĩ tích cực - nó không phải là "chỉ" bởi tiêu chuẩn nhưng rõ ràng thread-an toàn theo cách đó ...;) – Solkar

Trả lời

5

Đây là clang bug 18097. Here's một chuỗi dài thảo luận về vấn đề, có vẻ như là clang chỉ hỗ trợ các loại vô hướng cho T trong atomic<T>. Tiêu chuẩn C++ 11 nêu rõ (§29.5/1) rằng T có thể là bất kỳ loại có thể sao chép nào có thể sao chép được.

Cả tập quán thể hiện trong câu hỏi phải phù hợp với constructor này

constexpr atomic(T) noexcept; 

Cách duy nhất tôi có thể nghĩ đến làm việc xung quanh này là để mặc định xây dựng atomic<S> và sau đó sử dụng atomic::store để khởi tạo đối tượng.

std::atomic<S> asd; 
asd.store({1,2}); 
0

std::atomic<S> asd({1, 2});

std::atomic<S> có một constructor mà mất một giá trị kiểu S. Danh sách initializer {1, 2} được ngầm chuyển thành S tạm thời vì constructor này.

+2

@axnsan Bạn có thể giải thích tại sao khởi tạo đồng bộ không hoạt động? Nó sẽ làm việc theo ý kiến ​​của tôi. – vsoftco

+0

điều này không biên dịch trên 'clang ++'. Cả hai phiên bản tuy nhiên biên dịch trên 'g ++' – vsoftco

+0

@ vsoftco Ya, đó là vấn đề tôi đang gặp phải ... bằng cách sử dụng tiếng kêu. Có cách giải quyết nào không? – David

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