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};