Есть ли способ определить не динамический конструктор, который ограничивает диапазон любого конструктора по умолчанию позволяет мне сделать
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};
^
Это:
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 …
Других решений пока нет …