No seguinte programa 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
é móvel e suas funções de membro f()
têm operator()
parâmetro de objeto explícito (this A)
.
No compilador Clang surpreendentemente A{}.f()
funciona bem, mas A{}()
falha com o erro:
<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
Demonstração online: https://gcc.godbolt.org/z/hbfzMvE9f
Existe alguma diferença entre funções f()
e operator()
do ponto de vista da linguagem que explica seu tratamento observável pelo compilador?
Este é um bug de clang confirmado . O programa está bem formado. A expressão
A{}()
é equivalente a (interpretada como)A{}.operator()()
qual clang aceita . ComoA{}
é um prvalue (e, portanto, um rvalue), o operador call sobrecarregadoA::operator()(this A)
é uma opção viável aqui para callA{}.operator()()
.De over.call :