我今天偶然发现了类似的东西,随后尝试了一些东西并注意到以下内容在 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();
}
因此 B::getB
返回一个类型 A
,在它为自己分配值 20
之后(通过重载的 A::operator=
).
经过几次测试,它似乎返回了正确的值(c.get
将返回 20
,正如人们所期望的那样)。
所以我想知道,这是未定义的行为吗?如果是这样的话,究竟是什么原因造成的呢?如果不是,这样的代码有什么优势?
最佳答案
经过仔细检查,在@Kerrek SB 和@Aaron McDaid 的帮助下,以下内容:
return (((A)*this) = 20);
...类似于以下的速记(但晦涩)语法:
A a(*this);
return a.operator=(20);
...甚至更好:
return A(*this) = 20;
...因此是定义的行为。
关于类型转换的 C++ 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569889/