你能初始化unique_ptrs "static const vectors"吗?(C++17 与 GCC 7.3)
Can you initialise "static const vectors" of unique_ptrs? (C++17 with GCC 7.3)
我正在尝试创建一个默认对象(规则)的static const
列表,这些对象(规则)很大,可以经常复制,因此我想将它们存储在unique_ptr<>
vector
中。我注意到类似的问题已经出现了几次,但我不清楚这是否真的可行(我倾向于不可行)。即
- 不能将
initializer_list
与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
,然后将其引用为原始指针。例如:
static const std::string kString1 = "String 1";
static const std::string kString2 = "String 2";
static const std::vector<const std::string*> kStrings = {&kString1, &kString2};
感觉很讨厌,但代码接口保持相对不变,并且由于它不离开类的范围,因此对用户也是透明的。
任何想法,更正或更好的替代方案将不胜感激。
编辑- 关于这个问题,我已经测试了解决方案,它也可以工作。我对解决方案的问题是,它使initializer_list
能够以它们不是设计用于使用的方式使用,我不知道这将产生什么意想不到的后果,如果有的话。
我是不是误会了?有没有另一种方法可以初始化这样的向量
有一个,调用一个返回非常量向量的函数以用作初始值设定项。它甚至不必命名。它可能是一个立即调用的 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
视为常量。此外,编译器很可能会完全内联lambda,因此甚至不会有函数调用的开销。它真的是吃你的蛋糕和吃它。
尽管人们不得不想知道为什么要使用指向字符串(值类型)的唯一指针向量。矢量已经拥有其内容。因此,您可以削减中间人,这也将简化初始化。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何在c++17中制作一个模板包装器/装饰器
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- 枚举环境变量的惯用C++14/C++17方法
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC 7 C++17支持折叠表达式
- 你能初始化unique_ptrs "static const vectors"吗?(C++17 与 GCC 7.3)
- 带有 gcc 7.1/8.1 的英特尔编译器 17.0
- 是否可以在 GCC 中使用带有 C++17 的显式寄存器变量?
- C++11/14/17,GCC 7 与 GCC 8:好友类模板的名称查找
- 为什么 GCC 和 clang 之间编译的 c++17 lambda 存在差异?
- gcc 可以使用较旧的第三方库编译 C++17 代码吗?
- 在使用 -std=c++17 编译时在 GCC 中复活 std::auto_ptr
- Clang和GCC在转换C++17中非类型模板参数的自动说明符中存在分歧
- 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?
- C 17 GCC编译器为什么会发出有关未定义的警告
- GCC中更详细的C 17状态
- GCC 中 C++17 支持的状态如何?