提问人:ibe 提问时间:6/11/2016 更新时间:6/11/2016 访问量:77
可变参数模板参数 fowarding
Variadic templates argument fowarding
问:
假设我有一个利用 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)...);
}
答:
2赞
Brian Bi
6/11/2016
#1
第一个按值获取其参数。第二个通过左值引用获取其参数(因此不能使用非右值)。第三个也按值获取其参数,但将指针传递给 。第四个通过转发引用来获取其参数,并将它们完全转发给 。const
whatever
whatever
可变参数模板没有什么神奇之处;规则与只有一个参数相同。
2赞
Tim
6/11/2016
#2
template <typename... Args>
void foo(Args... args) {
whatever(args...);
}
foo
获取 的副本并将其作为 L 值传递给。args
whatever
template<typename... Args>
void foo(Args&... args) {
whatever(args...);
}
foo
获取对 L 值的引用,并将其作为 L 值传递给。args
whatever
template<typename... Args>
void foo(Args... args) {
whatever(&args...);
}
foo
获取 的副本,并将其作为指向 L 值的指针传递给它们。此处要注意对象生存期。args
whatever
template<typename... Args>
void foo(Args&&... args) {
whatever(std::forward<Args>(args)...);
}
foo
获取对 的转发引用。它们是 l 值还是 r 值取决于调用站点上发生的情况。然后将它们完美地转发到 ,保留其引用类型。斯科特·迈耶斯(Scott Meyers)最初称这些为“通用”引用,但现在转发引用是首选术语。args
whatever
上一个:Xcode 文件夹和组混淆
评论