小编Vin*_*nie的帖子

你能初始化unique_ptrs的"静态const向量"吗?(C++ 17与GCC 7.3)

我试图创建一个static const是往大了经常复制默认对象(规则)的名单,因此我想将它们保存在vectorunique_ptr<>.我已经注意到类似的问题使得这些轮次几次,但我不清楚这是否真的可行(我倾向于不可行).即

  1. 您不能使用initializer_list,unique_ptr因为访问成员是const导致复制操作.
  2. 您无法通过引用传递临时值,从而导致复制操作.

因此两者:

static const std::vector<std::unique_ptr<std::string>> kStrings = {
  std::unique_ptr<std::string>(new std::string("String 1")),
  std::unique_ptr<std::string>(new std::string("String 1"))
};
Run Code Online (Sandbox Code Playgroud)

static const std::vector<std::unique_ptr<std::string>> kStrings(
  std::unique_ptr<std::string>(new std::string("String 1")),
  std::unique_ptr<std::string>(new std::string("String 1"))
);
Run Code Online (Sandbox Code Playgroud)

不可行.

我误会了吗?有没有其他方法来初始化这样的矢量或者这是重新考虑设计的情况?我能想到的最简单的替代方法是创建对象a static const然后将它们作为原始指针引用.例如:

static const std::string kString1 = "String 1";
static const std::string kString2 = "String 2";

static const std::vector<const std::string*> kStrings = {&kString1, &kString2};
Run Code Online (Sandbox Code Playgroud)

它感觉很讨厌,但代码接口保持相对不变,因为它不会离开类的范围,所以对用户也是透明的.

任何想法,更正或更好的选择是值得赞赏的.

编辑 - 关于这个问题,我已经测试了解决方案,它也有效.我的解决方案的问题是它能够initializer_list以不被设计使用的方式使用,而且我不知道会产生什么样的意外后果,如果有的话.

c++ gcc stl c++17

4
推荐指数
1
解决办法
118
查看次数

标签 统计

c++ ×1

c++17 ×1

gcc ×1

stl ×1