首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变模板参数生成

可变模板参数生成
EN

Stack Overflow用户
提问于 2016-06-10 22:04:04
回答 2查看 73关注 0票数 1

假设我有一个函数foo(),它利用了c++多变的模板特性。现在,这些实现之间有什么区别:

代码语言:javascript
复制
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)...);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-10 22:12:44

代码语言:javascript
复制
template <typename... Args>
void foo(Args... args) {
    whatever(args...);
}

foo获取args的副本,并将它们作为l-值传递给whatever

代码语言:javascript
复制
template<typename... Args> 
void foo(Args&... args) {
     whatever(args...);
}

foo获取对args的l值引用,并将它们作为l值传递给whatever .

代码语言:javascript
复制
template<typename... Args>
void foo(Args... args) {
    whatever(&args...);
}

foo获取args的副本,并将它们作为指向l-值的指针传递给whatever。这里要小心物体的生命周期。

代码语言:javascript
复制
template<typename... Args>
void foo(Args&&... args) {
    whatever(std::forward<Args>(args)...);
}

foo获取对args的转发引用。它们是l值还是r值取决于调用站点发生了什么。然后,它们被完美地转发到whatever,保留它们的引用类型。Scott最初将这些引用称为“通用”引用,但现在首选的术语是转发引用。

票数 2
EN

Stack Overflow用户

发布于 2016-06-10 22:11:09

第一种观点是以价值为依据的。第二个参数由lvalue引用(因此不能使用非constrvalue)。第三个参数也以值表示,但将指针传递给whatever。第四种方法是通过转发引用来获取它的参数,并将它们完美地转发到whatever

变量模板没有什么神奇之处;规则是一样的,好像只有一个参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37757739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档