我偶然发现了类似的东西,然后尝试了一些事情,并注意到以下似乎在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.get将20按照人们的预期返回).
所以我想知道,这是不确定的行为?如果是这样的话,究竟是什么原因呢?如果没有,这样的代码有什么优势?
经过仔细检查,在 @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)
...因此是定义的行为。
| 归档时间: |
|
| 查看次数: |
993 次 |
| 最近记录: |