我的代码:
#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是左值,它如何折叠到右边的参数?
答案 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
。