Почему g ++ все еще требует -latomic
В29.5 Атомные типы рабочего проекта стандарта C ++ от ноября 2014 г.
Существует универсальный шаблон класса atomic. Тип аргумента шаблона T должен быть тривиально копируемым (3.9). [Примечание: аргументы типа, которые также не являются статически инициализируемыми, могут быть сложны в использовании. —Конечная записка]Итак, насколько я могу судить, это:
#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();
}
должен быть совершенно корректный стандартный код c ++ 14 (а также c ++ 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
все еще необходимо, или это просто что-то, что еще не было решено разработчиками компилятора?