我无法理解为什么a.funct()可以是赋值运算符的左操作数,即使funct()没有返回l值引用。
class A
{
public:
A funct () {A x; return x;}
};
int main ()
{
A a,b; a.funct()=b;
}
答案 0 :(得分:5)
在类的自动生成方法中,有
A& operator = (const A&);
使a.funct() = b
合法。
为了禁止对rvalue的影响,你可以从C ++ 11开始编写和实现
A& operator = (const A&) &; // Note the last &
所以分配只适用于左值。
答案 1 :(得分:0)
在代码中,funct
应该返回一个可以分配给的变量。
请注意funct
中的代码如果通过引用返回则非常危险;一旦函数结束,局部变量x
将超出范围,返回的变量将导致未定义的行为,因为它的析构函数将被调用。
答案 2 :(得分:0)
你的假设是错误的。您的代码完全有效。 试试这段代码:
#include <string>
#include <iostream>
class A
{
std::string m_name;
public:
A(const std::string& name) :m_name(name) {}
A funct() { A x("intern"); return x; }
A& operator=(const A& a)
{
m_name += a.m_name;
return *this;
}
void print() { std::cout << m_name << std::endl; }
};
int main()
{
A a("A"), b("B"); (a.funct() = b).print();//prints "internB"
}