在以下 C++23 程序中
struct A {
A() {}
A(A&&) = default;
void f(this A) {}
void operator() (this A) {}
};
int main() {
A{}.f(); // ok
A{}(); // Clang error
}
struct A
是可移动的,并且其成员函数f()
和operator()
具有显式的对象参数(this A)
。
在 Clang 中,编译器令人惊讶A{}.f()
地工作正常,但A{}()
失败并出现错误:
<source>:10:5: error: call to implicitly-deleted copy constructor of 'A'
<source>:3:5: note: copy constructor is implicitly deleted because 'A' has a user-declared move constructor
在线演示:https://gcc.godbolt.org/z/hbfzMvE9f
f()
从语言的角度来看,函数之间是否存在一些差异operator()
,可以解释编译器对它们的可观察处理?
这是一个已确认的 clang 错误。该程序格式正确。表达式
A{}()
相当于(解释为)clang 接受的A{}.operator()()
。由于是 prvalue(因此也是 rvalue),因此重载的 call 运算符是 call 的可行选项。A{}
A::operator()(this A)
A{}.operator()()
来自over.call: