不应该是std :: atomic缺乏值构造函数的标准特化

时间:2015-04-21 01:53:55

标签: c++ c++11 aggregate language-lawyer atomic

std::atomic模板的通用版本有一个声明为

的值构造函数

constexpr atomic( T desired );(参见here

还有人说bool,模板的整数和指针特化(引自cppreference

  

标准布局,简单的默认构造函数和琐碎的   析构函数。它们支持聚合初始化语法。

这是有道理的,对于只有普通默认ctor和dtor(即没有值ctor)的类,它们有资格作为聚合,因此支持聚合初始化语法。但是,以下代码在GCC和clang上编译良好:

std::atomic_int i(9);

这意味着应该存在值ctor。这违反了标准吗?

引自C ++ 11标准

  

这些专业应具有标准布局,平凡默认   构造函数和琐碎的析构函数。他们应各自支持   聚合初始化语法。

这并不清楚这些专业化是否应该具有值ctor。

1 个答案:

答案 0 :(得分:1)

标准规定了一些typedef,如[atomics.types.generic]:

  

如表146所示,应有与原子的整数特化相对应的命名类型,   以及与指定的atomic_bool对应的命名类型atomic<bool>。每个命名类型都是a   typedef到相应的专门化或相应专业化的基类。如果是基地   class,它应支持与相应的专业化相同的成员函数。

在表146中,我们看到atomic_intatomic<int>的typedef。 整数特化在与:

相同的部分中定义
template <> struct atomic<integral > {
    ...
    constexpr atomic(integral ) noexcept;
    ...
};

int中替换积分,我们有一个constexpr atomic_int(int )构造函数。坦率地说,如果无法使用atomic<T>初始化T,那就太奇怪了......

相关问题