默认赋值运算符的值类别 - 左值还是右值?(clang vs gcc)

Vit*_*meo 7 c++ expression language-lawyer c++17 value-categories

考虑以下代码:

struct S 
{ 
    S& operator=(const S&) = default;
};

int main()
{
    &(S() = S());
}
Run Code Online (Sandbox Code Playgroud)

GCC(主干)抱怨:

  error: taking address of rvalue [-fpermissive]
    8 |     &(S() = S());
      |      ~~~~~^~~~~~
Run Code Online (Sandbox Code Playgroud)

我发现上述错误令人惊讶,因为我希望S&返回类型可以生成左值表达式。另一方面,Clang(主干)在没有任何错误或警告的情况下接受代码。

在 Godbolt.org 上直播

  • 什么编译器在这里是正确的?

  • S() = S()右值还是左值?