không 0-khởi của std::atomic<integral_type>
biến có ý nghĩa gì?0-initialization atomics đảm bảo để thiết lập các thành viên giá trị 0?
Nguồn gốc của câu hỏi. Tôi có chức năng tĩnh std::array
của std::atomic<std::int>
, mà tôi muốn được đặt thành 0 trước lần sử dụng đầu tiên (không cần nói, hàm nơi mảng được gọi được gọi theo cách không thể đoán trước từ nhiều luồng).
Đoạn mã này là đẹp, nhưng không phải biên soạn do Atomics là không sao chép constructable:
#include <array>
#include <atomic>
void foo() {
using t = std::atomic<int>;
static std::array<t, 2> arr = {0, 0}; // <-- explicit, but errors out (see below)
static std::array<t, 2> arr2; // <-- implicit?, works
}
error: use of deleted function ‘std::atomic::atomic(const std::atomic&)’ std::array arr = {0, 0};
Bây giờ, tôi hiểu rằng tĩnh std::array
sẽ 0-khởi tạo tất cả đó là thành viên, và std::atomic<>
sẽ được khởi tạo 0. Nhưng chúng ta có một gurantee rõ ràng hoặc tiềm ẩn rằng nó sẽ thực sự thiết lập tất cả các giá trị đến 0? Cảm giác thông thường nói 'có' - sau khi tất cả, chúng tôi cho rằng lớp học sẽ có một thành viên thuộc loại int
và thành viên này sẽ được khởi tạo 0 lần. Nhưng liệu giả định đó có dựa trên cơ sở vững chắc của tiêu chuẩn?
Thú vị. Điều này tạo ra lỗi trong [GCC] (http://coliru.stacked-crooked.com/a/467922a19099c9a7) và [Clang] (http://coliru.stacked-crooked.com/a/3c8e5cba2847b829), nhưng không phải với MSVC++. Một tác dụng phụ có lẽ là [copy elision] (http://en.cppreference.com/w/cpp/language/copy_elision)? – wally
@flatmouse MSVC là lỗi, như chúng ta đều biết :) – SergeyA
Tôi nghĩ rằng bạn có nghĩa là đầy đủ và không có giấy tờ 'tính năng' :) – wally