【问题标题】:Ambiguity about rvalue reference passed and lvalue passed arguments on templated function [duplicate]关于模板化函数上传递的右值引用和传递的左值参数的歧义[重复]
【发布时间】:2019-09-24 12:52:15
【问题描述】:

考虑一下:

void test(int&& param){/*...*/}
int main(){
    int a{444};
    test(a);
}

当然它不会编译,因为没有为int 定义转换为int&&。但是下面的代码:

template<typename T>
void test(T&& param){/*..*/}


int main(){
    int a=826;
    test(a);
    return 0;
}

将编译。但为什么?什么原因?后者没有什么特别之处,只是函数 test 将为所有类型 T 实例化。但是我们仍然需要传递右值作为参数。那么为什么它,后来,编译? - 没有任何抱怨。然后我尝试了以下方法:

template<typename T>
void test(T&& param){/*..*/}

template<typename T>
void test(T param){/*...*/}

int main(){
    int a=826;
    test(a);
    return 0;
}

编译器会抱怨,因为函数调用在调用 test(T&amp;&amp; param)T=int&amp;test(T param)T=int 时不明确。 现在我完全不知道要推断什么。模板在这里有什么特别之处?为什么它不符合右值和左值的规则? 提前致谢

【问题讨论】:

标签: c++ templates parameter-passing c++14 generic-programming


【解决方案1】:

T&amp;&amp; 在这种情况下有时称为通用引用或转发引用。但情况是您陷入了特定的模板类型扣除规则。在这种情况下,param 的类型将是 int&amp;,那么您没有将左值绑定到右值。

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2014-09-09
    • 2020-11-27
    • 2020-03-08
    相关资源
    最近更新 更多