由重新定义的运算符“=”引起的分段错误

edd*_*kuo 0 c++ c++17

我用 g++ 和 clang++ 编译了这个程序。
G++ 可执行文件打印一个“触发 A 副本分配”。
Clang++ 可执行文件打印两个“触发器 A 副本分配”并出现分段错误。
有没有畸形?还是只是clang的问题?

版本:gcc-7.4.0/clang-10.0.0

#include <iostream>
struct A {
  A &operator =(const A &other) {
    std::cout << "trigger A copy assignment\n";
  }
};

int main() {
  A x,y;
  y = x;
}

Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 7

虽然不是正式的格式错误,但您的代码确实会创建未定义的行为,因为您的赋值运算符函数声明为返回A&,实际上并没有返回任何东西!

cppreference

在没有 return 语句的情况下从返回值函数(main 除外)的末尾流出是未定义的行为。

这个小的代码修改将防止clang崩溃(但可能不会做你想要的):

struct A {
    A& operator =(const A& other) {
        std::cout << "trigger A copy assignment\n";
        return *this; // MUST return SOMETHING!
    }
};
Run Code Online (Sandbox Code Playgroud)