我试图创建一个static const是往大了经常复制默认对象(规则)的名单,因此我想将它们保存在vector的unique_ptr<>.我已经注意到类似的问题使得这些轮次几次,但我不清楚这是否真的可行(我倾向于不可行).即
initializer_list,unique_ptr因为访问成员是const导致复制操作.因此两者:
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以不被设计使用的方式使用,而且我不知道会产生什么样的意外后果,如果有的话.