C++ c+中的非动态构造函数+;使用icpc?

C++ c+中的非动态构造函数+;使用icpc?,c++,c++11,thread-local,default-constructor,icc,C++,C++11,Thread Local,Default Constructor,Icc,有没有办法定义一个非动态构造函数来限制默认构造函数的范围 struct foo { int *bar; }; static __thread foo myfoo[10] = {nullptr}; ? i、 我想做什么 class baz { public: baz() = default; constexpr baz(decltype(nullptr)) : qux(nullptr) { } private: int *qux; }; static __t

有没有办法定义一个非动态构造函数来限制默认构造函数的范围

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

i、 我想做什么

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] = {baz(nullptr), baz(), baz(), baz(), baz(), ..., baz()};
因为这是数组元素的隐式初始化默认为构造函数的一般规则

因此,要么这样做:

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

或者让您的默认构造函数也是constepr…

有什么理由不这样定义构造函数:
constepr baz(int*ptr=nullptr):qux(ptr){}
我想允许从nullptr进行隐式转换,但不允许从其他指针进行隐式转换(例如,请参见
unique\u ptr
)。如果你所建议的实际上是添加一个额外的构造函数
baz()=default
constepr baz():qux(nullptr){}
,那么我可以这样做,但会
static_u线程baz mybaz[10]将数组初始化为默认值?是的,会,当数组未以其他方式显式初始化时,将使用默认构造函数。只要添加这个默认的constexpr构造函数,我们就会看到发生了什么……g++不接受
constexpr baz()=default,它说“错误:显式默认函数‘constexpr baz::baz()’不能声明为constexpr,因为隐式声明不是constexpr”。然而,icpc接受它,如果我去掉“={nullptr}”并保持构造函数的原样,这两个函数似乎都可以正常工作。然而,C++11标准()的§8.5第6项说“默认初始化T类型的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化格式错误);-如果T是数组类型,则每个元素都默认初始化;-否则,不会执行初始化。”,这表明mybaz是否为零初始化取决于编译器。可能吧?我在标准阅读方面不是很有经验
static __thread baz mybaz[10] = {nullptr, nullptr, nullptr, ..., nullptr};