Я читаю через Энтони Уильямса "С++ Concurrency в действии" и в главе 5, где рассказывается о новой модели памяти с многопотоковой памятью и атомных операциях, и он утверждает:
Чтобы использовать
std::atomic<UDT>
для определенного пользовательскогоUDT
, этот тип должен иметь тривиальный оператор присваивания копии.
Как я понимаю, это означает, что мы можем использовать std::atomic<UDT>
, если следующее возвращает true:
std::is_trivially_copyable<UDT>::value
По этой логике мы не сможем использовать std::string
в качестве аргумента шаблона для std::atomic
и корректно работать.
Однако следующий код компилируется и запускается с ожидаемым выходом:
#include <atomic>
#include <thread>
#include <iostream>
#include <string>
int main()
{
std::atomic<std::string> atomicString;
atomicString.store( "TestString1" );
std::cout << atomicString.load() << std::endl;
atomicString.store( "TestString2" );
std::cout << atomicString.load() << std::endl;
return 0;
}
Является ли это примером поведения undefined, который просто ведет себя так, как ожидалось?
Спасибо заранее!