通过make_unique/make_shared调用initializer_list构造函数
Calling initializer_list constructor via make_unique/make_shared
我正试图使用std::make_unique
来实例化一个类,该类的构造函数将接收std::initializer_list
。这里有一个最小的例子:
#include <string>
#include <vector>
#include <initializer_list>
#include <memory>
struct Foo {
Foo(std::initializer_list<std::string> strings) : strings(strings) {}
std::vector<std::string> strings;
};
int main(int, char**) {
auto ptr = std::make_unique<Foo>({"Hello", "World"});
return 0;
}
你可以在Coliru上看到它没有构建:
main.cpp:14:56: error: no matching function for call to 'make_unique(<brace-enclosed initializer list>)'
auto ptr = std::make_unique<Foo>({"Hello", "World"});
那么,make_unique
是否无法使用initializer_list
?GCC 4.9.1中是否存在错误?还是我忽略了什么?
std::make_unique
是一个函数模板,用于推导传递给对象构造函数的参数类型。不幸的是,支撑列表是不可推导的(auto
声明除外),因此当缺少参数类型时,无法实例化函数模板。
你可以不使用std::make_unique
,但请不要走那条路–为了孩子们,你应该尽可能避免裸体new
。或者,您可以通过指定类型来进行类型推导:
-
std::make_unique<Foo>(std::initializer_list<std::string>({"Hello", "World"}))
-
std::make_unique<Foo, std::initializer_list<std::string>>({"Hello", "World"})
-
auto il = { "Hello"s, "World"s }; auto ptr = std::make_unique<Foo>(il);
最后一个选项使用auto
声明的特殊规则,正如我在上面暗示的那样,do实际上推导出std::initializer_list
。
如果你准备键入一些额外的字符,你可以这样做:
auto ptr = std::make_unique<Foo>( make_init_list( { "Hello"s , "World"s } ));
其中init_list
被定义为
template<typename T>
std:: initializer_list<T> make_init_list ( std:: initializer_list<T> && l ) {
return l;
}
这允许进行推导,如果代码中有很多地方必须这样做,这很方便。
(适用于clang 3.9和gcc 6.2.0。我也可以在g++-4.8.4上工作,只是我必须调整std::string
-literal并更改为make_shared
。但make_init_list
中T
的推导效果良好。)
事实上,这是分机吗?make_init_list
扣减是否符合标准要求?
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- make 命令如何避免重新编译未更改的源文件?
- MAKE:找不到包含的用户定义的头文件?
- 'make check' GLIBC 运行时的链接问题
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- C2664 无法从'initializer list'转换参数
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- C++ 错误:"array must be initialized with a brace-enclosed initializer"
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- make 命令创建 .file,但不创建应用程序文件
- 如何摆脱导入的 make 项目中的 Eclipse 索引器"Type std::... could not be resolved"错误
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- 如何使用MySQL Connector and Make设置C++项目
- 使用 make 将对象文件放在特定目录中
- 我是 C++ 的新手,我试图调用 make 一个以 2 个类作为其参数的类构造函数
- "Make"失败并出现 Clang 错误 - 如何从 Clang 获得错误?
- 防止 GNU Make 在每次构建时生成 protobuf 代码
- Make zmqpp::socket::connect a std::future
- 链接从命令行转换为Make的库