我打算shared_ptr
在即将到来的项目中使用很多,所以(不知道std::make_shared
)我想编写一个可变参数模板函数spnew<T>(...)
作为shared_ptr
-returning的替代new
。一切都很顺利,直到我尝试使用构造函数包含initializer_list
. 当我尝试编译下面的最小示例时,我从 GCC 4.5.2 得到以下信息:
在函数'int main(int, char**)'中: 函数 'std::shared_ptr spnew(Args ...) [with T = Example, Args = {}]' 的参数太多 在函数“std::shared_ptr spnew(Args ...) [with T = Example, Args = {}]”中: 没有匹配函数调用'Example::Example()'
奇怪的是,如果我std::make_shared
替换spnew
. 在任何一种情况下,当涉及到时,它似乎都错误地推断出参数initializer_list
,错误地将Args...
其视为空。这是示例:
#include <memory>
#include <string>
#include <vector>
struct Example {
// This constructor plays nice.
Example(const char* t, const char* c) :
title(t), contents(1, c) {}
// This one does not.
Example(const char* t, std::initializer_list<const char*> c) :
title(t), contents(c.begin(), c.end()) {}
std::string title;
std::vector<std::string> contents;
};
// This ought to be trivial.
template<class T, class... Args>
std::shared_ptr<T> spnew(Args... args) {
return std::shared_ptr<T>(new T(args...));
}
// And here are the test cases, which don't interfere with one another.
int main(int argc, char** argv) {
auto succeeds = spnew<Example>("foo", "bar");
auto fails = spnew<Example>("foo", {"bar"});
}
这只是我的疏忽还是错误?