类型转换的 C++ 赋值

标签 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();
}

因此 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/

相关文章:

c++ - 让 pthread 等待另一个数据

C++ 部分互斥锁/临界区锁

C++ 捕获枚举值作为异常

c++ - 在 C++ 中返回一个字符串

C#转换为小数

c++ - 确定 NPAPI 中的浏览器代理设置以下载页面 SSL 证书

C++ Static_cast 指向虚拟基类的指针

Swift 3 通过 `Error` 发送自定义 `Notification` 不能在观察方法中转换为 `Error`

java - 将对象转换为原始类型

MYSQL查询-抓取所有符合条件的记录3次或以上