可变参数模板参数 fowarding

Variadic templates argument fowarding

提问人:ibe 提问时间:6/11/2016 更新时间:6/11/2016 访问量:77

问:

假设我有一个利用 c++ 可变参数模板功能的函数。现在,这些实现之间有什么区别:foo()

template <typename... Args>
void foo(Args... args) {
whatever(args...);
}

template<typename... Args>
void foo(Args&... args) {
whatever(args...);
}

template<typename... Args>
void foo(Args... args) {
whatever(&args...);
}

template<typename... Args>
void foo(Args&&... args) {
whatever(std::forward<Args>(args)...);
}
C++ 模板 variadic-templates

评论


答:

2赞 Brian Bi 6/11/2016 #1

第一个按值获取其参数。第二个通过左值引用获取其参数(因此不能使用非右值)。第三个也按值获取其参数,但将指针传递给 。第四个通过转发引用来获取其参数,并将它们完全转发给 。constwhateverwhatever

可变参数模板没有什么神奇之处;规则与只有一个参数相同。

2赞 Tim 6/11/2016 #2
template <typename... Args>
void foo(Args... args) {
    whatever(args...);
}

foo获取 的副本并将其作为 L 值传递给。argswhatever

template<typename... Args> 
void foo(Args&... args) {
     whatever(args...);
}

foo获取对 L 值的引用,并将其作为 L 值传递给。argswhatever

template<typename... Args>
void foo(Args... args) {
    whatever(&args...);
}

foo获取 的副本,并将其作为指向 L 值的指针传递给它们。此处要注意对象生存期。argswhatever

template<typename... Args>
void foo(Args&&... args) {
    whatever(std::forward<Args>(args)...);
}

foo获取对 的转发引用。它们是 l 值还是 r 值取决于调用站点上发生的情况。然后将它们完美地转发到 ,保留其引用类型。斯科特·迈耶斯(Scott Meyers)最初称这些为“通用”引用,但现在转发引用是首选术语。argswhatever