首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转发非引用类型的引用

转发非引用类型的引用
EN

Stack Overflow用户
提问于 2017-12-09 08:57:07
回答 2查看 247关注 0票数 0
代码语言:javascript
复制
 template<typename T>
 void F(T&& x) {}

如果我们用整数类型的参数来调用它&一切都是明确的--引用就会发生崩溃,而且我们仍然有lvalue-引用。但是,如果我们用int参数来调用它,会发生什么。我的想法是:我们已经推导了T=int类型,用rvalue-引用来修饰它,所以F采用整&参数,用int类型调用它会导致错误。但在实数F中,这类论点被认为是一种参考。参考价值从何而来?编译器应用了什么规则来获得int& from int?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-09 10:07:16

自C++17以来,C++标准中就有转发引用的概念。Normaly将模板参数推导为非参考参数。但是对于转发引用的具体情况,如果相应的参数是一个lvalue,则该参数被推导为一个引用。C++标准(N4700)[temp.over.deduct.call]/3

...A转发引用是对不表示类模板的模板参数(在类模板参数推导(over.match.class.deduct)期间)的不限定模板参数的rvalue引用。如果P是一个转发引用,而该参数是一个lvalue,则类型“lvalue引用到A”代替A作为类型演绎.

对于函数调用的关注,它的含义与C++11(N337)C++14(N414) tem.over.duct.Call/3中的等效段落相同:

...If P是对cv-非限定模板参数的rvalue引用,参数是lvalue,类型“lvalue引用A”代替A用于类型演绎.

票数 2
EN

Stack Overflow用户

发布于 2017-12-09 09:23:55

转发引用导出lvalue的lvalue引用和rvalue的rvalue引用。例如,即使对于 lvalue (类型为int&& ),它仍将推导出int& (与int类型的值一样),同样,对于intint&&类型的lvalue,它也将推导出int&&

代码语言:javascript
复制
template<typename T>
class show;

template<typename T>
void F(T&& x) 
{ show<decltype(x)>();}

int main() {
    int&& x = 5;
    F(x);
}

main.cpp:6:3: error:未定义模板“show”的隐式实例化

代码语言:javascript
复制
int main() {
    F(5);
}

main.cpp:6:3: error:未定义模板“show”的隐式实例化

代码语言:javascript
复制
int main() {
    int x = 5;
    F(x);
}

main.cpp:6:3: error:未定义模板“show”的隐式实例化

代码语言:javascript
复制
int main() {
    F([]()->int{return 5;}());
}

main.cpp:6:3: error:未定义模板“show”的隐式实例化

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

https://stackoverflow.com/questions/47726959

复制
相关文章

相似问题

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