通用参考模板类型始终评估为左值

时间:2017-09-18 06:48:57

标签: c++ string function rvalue lvalue

我的代码:

#include <string>
#include <utility>
#include <iostream>

void store(std::string & val)
{
    std::cout << "lvalue " << val << '\n';
}

void store(std::string && val)
{
    std::cout << "rvalue " << val << '\n';
}

template<typename T> void print(T && val)
{
    std::cout << std::boolalpha << std::is_lvalue_reference<T>::value << " ";
    store(std::forward<T>(val));
}

int main()
{
    std::string val("something");
    print(val);
    print("something else");
}

我的输出:

true lvalue something
true rvalue something else

我读过Universal引用并理解为什么当输入是左值时T是左值但我不明白当输入是右值时T是左值,它如何折叠到右边的参数?

2 个答案:

答案 0 :(得分:3)

问题不在于转发参考。这是因为你没有将std::string rvalue传递给函数。

您传递的字符串文字长度为15个字符,其类型为const char[15]。字符串文字是不可修改的左值,因此引用推导为const char (&)[15]

您看到rvalue重载打印的原因是,您可以从字符数组中构造临时std::string

答案 1 :(得分:3)

  

当输入为右值时,我不明白T是左值,它如何崩溃到正确的参数?

不,输入不是右值。

字符串文字是左值,这是您作为参数传递给函数的内容。这就是为什么&#34; true&#34;打印出来。

现在,请回想一下字符串文字无法修改String Literals)。

所以,&#34;其他东西&#34;长度为14 + 1(对于空终止符),因此为const char[15]

现在,由于无法修改字符串文字,因此引用将推断为:

 const char(&)[15];

您方法的原型是:

store(std::string && val)

std::string创建临时const char