【问题标题】:cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'无法将“int&”类型的非常量左值引用绑定到“int”类型的右值
【发布时间】:2017-12-01 17:14:49
【问题描述】:

以下代码编译失败:

#include <iostream>

using namespace std;

int add2(const int& x)
{
    return x + 2;
}

template <typename T>
T add2T(T&& x) {
    return add2(std::forward<T>(x));
}

int main(int argc, char** argv) {
    int x = 0;

    cout << "Add 2" << endl;

    cout << add2(2) << endl;
    cout << add2(x) << endl;

    cout << "Add 2T" << endl;

    cout << add2T(10) << endl; 
    cout << add2T(x) << endl;

    return 0;
}

带有此消息:

main.cpp: In instantiation of 'T add2T(T&&) [with T = int&]':
main.cpp:26:20:   required from here
main.cpp:12:16: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
     return add2(std::forward<T>(x));
            ~~~~^~~~~~~~~~~~~~~~~~~~

我不确定为什么编译器会尝试将非常量左值引用绑定到右值。无论如何,前向应该衰减为左值引用,对吧?

【问题讨论】:

    标签: c++ perfect-forwarding


    【解决方案1】:

    问题与转发无关。

    在调用add2T(x) 中,推导出的模板参数Tint&amp;。 (只有这样T&amp;&amp; 才能成为左值引用类型。)因此返回类型也是int&amp;。但是return的操作数(即add2(std::forward&lt;T&gt;(x)))是一个右值,不能用来初始化int&amp;。因此出现错误消息。

    如果要防止返回类型变成引用类型,可以申请std::decay_t

    template <typename T>
    std::decay_t<T> add2T(T&& x)
    

    【讨论】:

    • 对!事后看来,这比我想象的要简单得多。谢谢!
    猜你喜欢
    • 2022-11-07
    • 2021-07-19
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2021-10-26
    相关资源
    最近更新 更多