您可以初始化unique_ptrs的“静态const向量”吗? (带有GCC 7.3的C ++ 17)

时间:2018-07-08 05:46:12

标签: c++ gcc stl c++17

我正在尝试创建static const默认对象(规则)的列表,这些列表要经常复制,因此,我想将它们存储在{{1}的vector中}。我注意到类似的问题已经进行了几次,但是我不清楚这是否确实可行(我倾向于不可行)。即

  1. 您不能将unique_ptr<>initializer_list一起使用,因为对成员的访问是常量,从而导致复制操作。
  2. 您不能通过引用传递临时文件,从而导致复制操作。

因此两者:

unique_ptr

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

不可行。

我误会了吗?有没有另一种方法可以初始化这样的向量,或者这是重新考虑设计的情况?我能想到的最简单的替代方法是创建一个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")) ); 对象,然后将其引用为原始指针。例如:

static const

感觉很讨厌,但是代码接口保持相对不变,并且由于它没有离开类的范围,因此对用户也是透明的。

感谢任何想法,更正或更好的选择。

编辑-关于this question,我已经测试了该解决方案,它也可以工作。我对解决方案的问题是,它使static const std::string kString1 = "String 1"; static const std::string kString2 = "String 2"; static const std::vector<const std::string*> kStrings = {&kString1, &kString2}; 的使用方式不符合设计目的,而且我也不知道会有什么意外的结果。

1 个答案:

答案 0 :(得分:7)

  

我误会了吗?还有另一种初始化此类向量的方法

有一个调用返回非常量向量的函数来用作初始化程序。它甚至不必被命名。可能是立即调用的lambda。

static const std::vector<std::unique_ptr<std::string>> kStrings = [] {
  std::vector<std::unique_ptr<std::string>> ret;
  // populate ret
  return ret;
}(); // <-- Invoke the lambda immediately after defining it. 

现在,您可以使用复杂的初始化逻辑并将kStrings仍视为const。此外,编译器很有可能会完全内联lambda,因此甚至没有函数调用的开销。确实是在吃蛋糕也要吃。

尽管有人想知道为什么要使用一个指向字符串的唯一指针向量(值类型)。向量已拥有其内容。因此,您可能会削减中间人,这也将简化初始化。