2

C++11 では、次のような多くの属性を持つ構造体があります。

#include <atomic>
struct Foo {
  int x;
  int y;
  // ...
  // LOTS of primitive type attributes, followed by...
  // ...
  std::atomic_bool bar;
}

そして、次のようにインスタンスを定義したいと思います:

bool bar_value = true;
Foo my_foo = {/*attribute values*/, bar_value};

ただし、アトミックではコピーの構築が許可されていないと思うため、atomic_bool は「削除された関数の使用」エラーをスローしています。コンストラクターを書き出すか、各値を個別に割り当てる以外に、これを回避する方法はありますか?

多くの属性の 1 つが特殊なケースであるという理由だけで、この比較的平凡な構造体を特別な方法で扱わなければならないのは、不便に思えます。

アップデート:

  • テイカーはいますか?私は周りを見回してきましたが、これを解決する簡単な方法はないようです。
4

1 に答える 1

2

atomic_bool の初期化を独自の初期化子リストにラップしてみてください。g++ 4.7でうまくいきました。

#include <atomic>
#include <iostream>

struct Foo
{
    int x;
    int y;
    std::atomic_bool bar;
};

int main(int, char**)
{
    Foo f1 = {1, 2, {true}};
    Foo f2 = {3, 4, {false}};

    std::cout << "f1 - " << f1.x << " " << f1.y << " "
              << (f1.bar.load()?"true":"false") << std::endl;
    std::cout << "f2 - " << f2.x << " " << f2.y << " "
              << (f2.bar.load()?"true":"false") << std::endl;
}

次の出力が得られました。

$ g++ -std=c++11 test.cpp -o test && ./test
f1 - 1 2 true
f2 - 3 4 false
于 2013-06-04T07:37:30.283 に答える