2

似乎没有办法使用 C++14 来初始化原子成员。以下不起作用(在 gcc 8.0.1 上运行):

#include <atomic>
#include <iostream>

struct stru {
  std::atomic_int32_t val_0;
  std::atomic_int32_t val_1;
};

int main() {
  auto p = new stru{0, 1};
  std::cout << p->val_0 << ", " << p->val_1 << std::endl; 
}

错误信息:

error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
   auto p = new stru{0, 1};
                     ^

这是因为原子类型既不可复制也不可移动,因此不可复制初始化。然而,以下似乎有效(生活在 gcc 8.0.1 上)。

#include <atomic>
#include <iostream>

struct stru {
  std::atomic_int32_t val_0;
  std::atomic_int32_t val_1;
};

int main() {
  auto p = new stru{};
  std::cout << p->val_0 << ", " << p->val_1 << std::endl; 
}

这有效地执行零初始化,因此无法初始化为零以外的值。有没有办法初始化为其他指定的值?

4

2 回答 2

2

帕特里克的解决方案有效,但他的解释对我来说并不正确。所以我发布了我在这里找到的解释。对于代码auto p = new stru{{0}, {1}}; 聚合初始化,效果如下:

如果初始化子句是嵌套的花括号初始化列表(不是表达式),则从该子句列表初始化相应的数组元素/类成员/公共基(C++17 起):聚合初始化是递归的。

因此,成员不是复制初始化,而是从花括号初始化列表中复制列表初始化。

于 2018-02-17T04:21:01.133 回答
-1

1不是s 0std::atomic_int32_t以下作品:

#include <atomic>
#include <iostream>

struct stru {
  std::atomic_int32_t val_0;
  std::atomic_int32_t val_1;
};

int main() {
  auto p = new stru{{0}, {1}};
  std::cout << p->val_0 << ", " << p->val_1 << std::endl; 
}

编辑:为什么会这样?对初始化列表中的每个元素进行复制初始化:

每个直接公共...非静态类成员,按照类定义中数组下标/外观的顺序,从初始化列表的相应子句复制初始化。

在您的示例中,1and0被隐式转换为std::atomic_int32_t,并且 astd::atomic_int32_t不能从 a 复制初始化std::atomic_int32_t。在额外的{}版本中,val_0并且val_1是从 s 初始化的副本std::initializer_list<int>,这很好。

于 2018-02-17T03:43:05.260 回答