gpt4 book ai didi

c++ - 转发非引用类型的引用

转载 作者:行者123 更新时间:2023-11-28 01:39:46 26 4
gpt4 key购买 nike

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

如果我们用 int& 类型的参数调用它,一切都很清楚——引用折叠发生了,我们仍然有左值引用。但是如果我们用例如 int 参数调用它会发生什么。我的想法:我们推导了类型T=int,用右值引用修饰它,所以F接受int&&参数并用int类型调用它会导致错误。但在真正的 F 中采用左值引用这样的参数。左值引用从何而来?编译器应用什么规则从 int 获取 int&?

最佳答案

从C++17开始,C++标准中就有了转发引用的概念。通常,模板参数被推断为非引用。但是对于 转发引用 的特定情况,如果相应的参数是左值,则参数被推导为引用。 C++ standard (N4700)[temp.over.deduct.call]/3 :

[...]A forwarding reference is an rvalue reference to a cv-unqualified template parameter that does not represent a template parameter of a class template (during class template argument deduction ([over.match.class.deduct])). If P is a forwarding reference and the argument is an lvalue, the type “lvalue reference to A” is used in place of A for type deduction.[...]

对于函数调用的关注,它与C++11(N337)中的这个等价段落具有相同的含义。和 C++14(N414) [temp.over.deduct.call]/3:

[...]If P is an rvalue reference to a cv-unqualified template parameter and the argument is an lvalue, the type “lvalue reference to A” is used in place of A for type deduction[...]

关于c++ - 转发非引用类型的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com