Xem xét:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
Các nội dung của foo bây giờ có hợp lệ không? Hay tôi cần phải lặp đi lặp lại một cách rõ ràng và khởi tạo chúng? Tôi đã kiểm tra trên Godbolt và nó có vẻ ổn, tuy nhiên tiêu chuẩn dường như rất bối rối về điểm này.
Hàm tạo std :: vector cho biết nó chèn các thể hiện được chèn mặc định của std::atomic<int>
, là giá trị được khởi tạo thông qua vị trí new
.
Tôi nghĩ rằng hiệu ứng khởi tạo giá trị này được áp dụng:
2) nếu T là một loại lớp với hàm tạo mặc định không do người dùng cung cấp cũng không bị xóa (nghĩa là nó có thể là một lớp với hàm tạo mặc định được định nghĩa ngầm định hoặc mặc định), thì đối tượng được khởi tạo bằng 0 và sau đó nó là khởi tạo mặc định nếu nó có một hàm tạo mặc định không tầm thường;
Vì vậy, dường như với tôi rằng các nguyên tử là không khởi tạo. Vì vậy, câu hỏi là, không khởi tạo std::atomic<int>
kết quả trong một đối tượng hợp lệ?
Tôi sẽ đoán rằng câu trả lời là "có trong thực tế nhưng nó không thực sự được xác định"?
Lưu ý: Câu trả lời này đồng ý rằng nó không được khởi tạo, nhưng thực sự không nói nếu điều đó có nghĩa là đối tượng hợp lệ.
atomic_init
. Dù sao thì bạn cũng phải đồng bộ hóa xung quanh mã trong câu hỏi