类型转换的C++赋值

net*_*der 5 c++ casting

我偶然发现了类似的东西,然后尝试了一些事情,并注意到以下似乎在G ++中是合法的:

struct A {
    int val_;
    A() { }
    A(int val) : val_(val) { }
    const A& operator=(int val) { val_ = val; return *this; }
    int get() { return val_; }
};

struct B : public A {
    A getA() { return (((A)*this) = 20); } // legal?
};

int main() {
    A a = 10;
    B b;
    A c = b.getA();
}
Run Code Online (Sandbox Code Playgroud)

因此B::getB返回一个类型A,在它之后为20自己赋值(通过重载A::operator=).

经过几次测试后,似乎它返回了正确的值(c.get20按照人们的预期返回).

所以我想知道,这是不确定的行为?如果是这样的话,究竟是什么原因呢?如果没有,这样的代码有什么优势?

net*_*der 3

经过仔细检查,在 @Kerrek SB 和 @Aaron McDaid 的帮助下,得到以下结果:

return (((A)*this) = 20);
Run Code Online (Sandbox Code Playgroud)

...就像以下的简写(但晦涩)语法:

A a(*this); 
return a.operator=(20);
Run Code Online (Sandbox Code Playgroud)

...或者甚至更好:

return A(*this) = 20;
Run Code Online (Sandbox Code Playgroud)

...因此是定义的行为。