【发布时间】:2014-12-10 08:08:14
【问题描述】:
我正在尝试使用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_lists 吗? GCC 4.9.1 中是否存在错误?还是我忽略了什么?
【问题讨论】:
-
不能通过模板参数推导推导出括号列表。试试
make_unique<Foo>(std::initializer_list<std::string>({"Hello", "World"}))。 -
@KerrekSB 好吧,这看起来像是对我的回答 :)
-
嗯,它有用吗,有帮助吗?
-
@KerrekSB 是的!但是,那个语法。
initializer_lists 绝对是个奇怪的小玩意儿。在那种特殊情况下,我想我会从new调用中构造unique_ptr。 -
这很遗憾,但可以理解。
std::initializer_list是一个可怕的错误设计。对此感到抱歉。
标签: c++ unique-ptr c++14 initializer-list