C++ 標準 2014年11 月のワーキング ドラフトの29.5 Atomic typesでは、次のように述べられています。
- ジェネリック クラス テンプレート アトミックがあります。テンプレート引数 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
はありますか、それともコンパイラのメンテナによってまだ対処されていないだけですか?