如何命名单个函数参数包? 问题很简单——我在ISO C++文档中找不到一个更好的例子: template<class ... targs> void func(targs ... args);
但上述或其他类似的表述不会在Clang下编译 你知道为什么和怎样做吗?另外,最新的ISO C++标准也将受到欢迎。 我想做的是通过我自己的函数实现“new”操作符行为,为此,我需要传递大小可变的构造函数参数,如下所示:如何命名单个函数参数包? 问题很简单——我在ISO C++文档中找不到一个更好的例子: template<class ... targs> void func(targs ... args);,c++,parameters,clang,iso,pack,C++,Parameters,Clang,Iso,Pack,但上述或其他类似的表述不会在Clang下编译 你知道为什么和怎样做吗?另外,最新的ISO C++标准也将受到欢迎。 我想做的是通过我自己的函数实现“new”操作符行为,为此,我需要传递大小可变的构造函数参数,如下所示: void func(auto ... args) { func1(args...); //here 'args' to be expanded } struct x_new { template<class T> inline T *allo
void func(auto ... args)
{
func1(args...); //here 'args' to be expanded
}
struct x_new
{
template<class T>
inline T *allocate(... arg)
{
return new T(arg...);
}
};
struct x_new
{
模板
内联T*分配(…参数)
{
返回新的T(arg…);
}
};
现在不能在Clang下编译,我不知道为什么。像往常一样使用普通模板参数包怎么样?比如
template<typename T, typename... argsT>
T *allocate(argsT... args)
{
return new T(std::forward<argsT>(args)...);
}
模板
T*分配(argsT…args)
{
返回新的T(标准::转发(参数)…);
}
clang与template void func(targets…args)没有任何问题代码>。它也乐于接受你为它写的身体。你的问题到底是什么?这不是一个单独命名的参数包,而是其他东西。这是怎么一回事?还有为什么我不能写第二个?你想做什么?你能展示一下你想如何使用你的功能吗?你到底想解决什么问题?相关阅读:。您似乎在某种程度上混淆了模板函数与可变参数(实际上是一个完整的函数,实例化取决于您对函数的调用)和C风格的varargs。您似乎还对auto
做出了一些有趣的假设。请注意,auto
不是“魔法类型删除”,它有非常明确(且严格)的规则。如果您编写auto
,编译器需要一种方法来派生正确的类型,这里不是这种情况。“命名参数包”不是一个标准术语,我不知道您的意思args
是一个参数包,在我看来它是命名的,那么为什么它不是一个命名的参数包呢?至于第二种方法有什么问题,clang的信息对我来说似乎很清楚:不能声明参数auto
。更好的方法是使用std::forward
。但是是的,参数包的使用是正确的。值得注意的是,调用allocate
仍然允许从实际参数推断argsT
,它没有为包指定固定但为空的集。使用std::forward
的方法是std::forward(args)…
。您需要指定模板参数,因为它不能从args
有意义地推导出来,因为它们总是左值。…
需要在调用之外,因为需要为每个参数调用std::forward
。只要你只有一个参数,它就会起作用,但是如果你有更多的参数,它就会崩溃。如果你没有,那么,我还不完全了解所有新的东西。我也想从ISO C++标准中引用一个引文来解释这是什么,为什么我的第二个例子是无效的。