gpt4 book ai didi

c++ - 通用引用模板类型总是评估为左值

转载 作者:太空狗 更新时间:2023-10-29 20:21:03 25 4
gpt4 key购买 nike

我的代码:

#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

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

最佳答案

I don't understand how is T a lvalue when the input is a rvalue, how does that collapse to the right paramter?

不,输入不是右值。

字符串文字是左值,这就是您作为参数传递给函数的内容。这就是打印“true”的原因。

现在,回想一下不能修改字符串文字(String Literals)。

因此,“其他”的长度为 14 + 1(对于空终止符),因此是 const char[15]

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

 const char(&)[15];

你的方法原型(prototype)是:

store(std::string && val)

它从 const char 创建一个临时的 std::string

关于c++ - 通用引用模板类型总是评估为左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46273141/

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