【发布时间】:2020-02-27 06:12:47
【问题描述】:
我试图弄清楚为什么以下 sn-p 调用 LValue 强制转换运算符重载:
#include <iostream>
class Foo
{
public:
Foo(int i = 0) : i(i) {}
operator const int& () const &
{
std::cout << "lvalue\n";
return i;
}
operator int () const &&
{
std::cout << "rvalue\n";
return i;
}
int i = 0;
};
Foo Fool()
{
return Foo(5);
}
int main()
{
const int& i = Fool();
const int j = Fool();
return 0;
}
目前的输出是:
左值
右值
但据我了解,Fool() 返回一个rvalue,并且由于const& 可以绑定到rvalues,因此无需构造lvalue Foo。
谁能解释为什么要构造lvalue?我相信这是一个悬空的lvalue。
【问题讨论】:
-
你的编译器是什么?这对我来说就像一个错误
-
@StoryTeller-UnslanderMonica 我在 clang 和 msvc 上试过这个,都给出了相同的结果。
-
转换运算符比较特殊,我还在努力理解,详细解释见stackoverflow.com/questions/54161013/…(我还是没搞懂)
-
我相信标准不提供任何保证,即通过方法返回的临时实例成员的引用在绑定到 const ref 后仍然有效。 IE。那里可能发生崩溃
-
@JVApen 我深入研究了这个问题,现在我只能说我和你在同一条船上。使用简单的
get()函数而不是隐式转换运算符似乎可以解决这个问题。
标签: c++ rvalue lvalue ref-qualifier