В 29.5. Атомные типы рабочего стандарта С++ Standard в ноябре 2014 года:
- Существует общий шаблонный шаблон. Тип аргумента шаблона T должен быть тривиально скопируемым (3.9). [Примечание. Невозможно использовать аргументы типа, которые также не могут быть статически инициализированы. -end note]
Итак - насколько я могу судить - это:
#include <atomic>
struct Message {
unsigned long int a;
unsigned long int b;
};
std::atomic<Message> sharedState;
int main() {
Message tmp{1,2};
sharedState.store(tmp);
Message tmp2=sharedState.load();
}
должен быть вполне допустимым стандартным кодом С++ 14 (а также С++ 11). Однако, если я не связываю libatomic
вручную, команда
g++ -std=c++14 <filename>
дает - по крайней мере, на Fedora 22 (gcc 5.1) - следующую ошибку связывания:
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status
Если я пишу
g++ -std=c++14 -latomic <filename>
все в порядке. Я знаю, что стандарт ничего не говорит о флажках или библиотеках компилятора, которые должны быть включены, но до сих пор я думал, что любой стандартный сопоставимый код одного файла может быть скомпилирован с помощью первой команды.
Так почему же это не относится к моему примеру? Существует ли рациональное, почему -latomic
по-прежнему необходимо, или это просто то, что еще не было обработано сторонними компиляторами?