gpt4 book ai didi

类型转换的 C++ 赋值

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:23 25 4
gpt4 key购买 nike

我今天偶然发现了类似的东西,随后尝试了一些东西并注意到以下内容在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com