如何命名单个函数参数包? 问题很简单——我在ISO C++文档中找不到一个更好的例子: template<class ... targs> void func(targs ... args);

如何命名单个函数参数包? 问题很简单——我在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

但上述或其他类似的表述不会在Clang下编译

你知道为什么和怎样做吗?另外,最新的ISO C++标准也将受到欢迎。 我想做的是通过我自己的函数实现“new”操作符行为,为此,我需要传递大小可变的构造函数参数,如下所示:

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++标准中引用一个引文来解释这是什么,为什么我的第二个例子是无效的。