1

デフォルトのコンストラクターが許可する範囲を制限する非動的コンストラクターを定義する方法はありますか

struct foo {
  int *bar;
};
static __thread foo myfoo[10] = {nullptr};

?

つまり、やりたい

class baz {
  public:
    baz() = default;
    constexpr baz(decltype(nullptr)) : qux(nullptr) { }

  private:
    int *qux;
};
static __thread baz mybaz[10] = {nullptr};

そしてそれを機能させます。

現在、icpcは教えてくれます

main.cpp(9): error: thread-local variable cannot be dynamically initialized
  static __thread baz mybaz[10] = {nullptr};
                      ^
4

1 に答える 1

0

これ:

static __thread baz mybaz[10] = {nullptr};

次と同等です。

static __thread baz mybaz[10] = {baz(nullptr), baz(), baz(), baz(), baz(), ..., baz()};

これは、配列要素の暗黙的な初期化がデフォルトのコンストラクターであるという一般的な規則であるためです。

したがって、次のいずれかを行います。

static __thread baz mybaz[10] = {nullptr, nullptr, nullptr, ..., nullptr};

または、デフォルトのコンストラクターも constexpr にします...

于 2012-11-17T21:48:36.403 に答える