- 主题:[求助]请教右值引用与函数重载的问题
如下代码,为何调用的是第一个版本的reference函数?编译器是按照什么规则来选择重载函数?
#include <iostream>
#include <string>
void reference(std::string& str) {
std::cout << "lvalue" << std::endl;
}
void reference(std::string&& str) {
std::cout << "rvalue" << std::endl;
}
int main()
{
std::string lv1 = "string,";
std::string&& rv2 = lv1 + lv2;
reference(rv2); // output: lvalue
return 0;
}
--
FROM 114.253.34.*
哪怕按照字面意思,能够出现在等式左边的就是左值,也知道rv2是一个左值,自然匹配左值重载。
【 在 SunnyFounder 的大作中提到: 】
: 如下代码,为何调用的是第一个版本的reference函数?编译器是按照什么规则来选择重载函数?
:
: #include <iostream>
: ...................
--来自微水木3.5.11
--
FROM 140.206.195.*
按照字面意思,函数 void reference(std::string&& str) 接受一个类型为std::string&&的参数,而rv2的类型就是std::string&&,这两者相互匹配,这难道不符合直觉吗?
【 在 KillnCov 的大作中提到: 】
: 哪怕按照字面意思,能够出现在等式左边的就是左值,也知道rv2是一个左值,自然匹配左值重载。
--
FROM 114.253.36.*
rv2是一个有名字的右值引用(named rvalue reference),会被当做左值看待
The compiler treats a named rvalue reference as an lvalue and an unnamed rvalue reference as an rvalue.
https://docs.microsoft.com/en-us/cpp/cpp/rvalue-reference-declarator-amp-amp?view=msvc-170
--
FROM 114.241.225.*
直觉是右值引用绑定右值,左值引用绑定左值。
按照你的理解,c++就要大改了。
【 在 SunnyFounder 的大作中提到: 】
: 按照字面意思,函数 void reference(std::string&& str) 接受一个类型为std::string&&的参数,而rv2的类型就是std::string&&,这两者相互匹配,这难道不符合直觉吗?
: 【 在 KillnCov 的大作中提到: 】
: : 哪怕按照字面意思,能够出现在等式左边的就是左值,也知道rv2是一个左值,自然匹配左值重载。
: ...................
--来自微水木3.5.11
--
FROM 140.206.195.*
函数版本的选择碰到右值引用的情况,应该先判断传入的argument是左值或者右值,然后再考虑parameter的类型。我想你的回复应该是这个意思。谢谢指教,我基本上明白了。
【 在 KillnCov 的大作中提到: 】
: 直觉是右值引用绑定右值,左值引用绑定左值。
: 按照你的理解,c++就要大改了。
--
FROM 114.253.36.*
应该是是 A&&a=b;退化成A&a =b;了吧,这种最好给个警告。
【 在 SunnyFounder 的大作中提到: 】
: rv2 确实是一个左值,因为rv2是可以寻址的,不好理解的在于,rv2不仅是一个左值,它的类型还告诉我们,它是一个指向右值的引用。这让我这样的初学者很容易很感困惑的地方。
: 谢谢你的回复。
: --
发自「今日水木 on IN2010」
--
FROM 222.129.51.*
真是太难了,怪不得说c++不是强类型
各种implicit的规则
【 在 SunnyFounder 的大作中提到: 】
: rv2 确实是一个左值,因为rv2是可以寻址的,不好理解的在于,rv2不仅是一个左值,它的类型还告诉我们,它是一个指向右值的引用。这让我这样的初学者很容易很感困惑的地方。
: 谢谢你的回复。
--
FROM 114.249.23.*
好象正式名称叫 reference collapse 不知道该怎么翻译。
【 在 ble 的大作中提到: 】
: 应该是是 A&&a=b;退化成A&a =b;了吧,这种最好给个警告。
: 发自「今日水木 on IN2010」
--
FROM 114.253.36.*