Vejo uma pergunta semelhante Construtor de movimento padrão recebendo um parâmetro constante , que tem 8 anos, com a resposta Não .
Mas, ao mesmo tempo, um programa ligeiramente modificado com o construtor padrão após a definição da classe:
struct A {
A(const A&&);
};
A::A(const A&&) = default;
aceito pelo EDG 6.7 e lançado recentemente pelo GCC 15.1. Demonstração online: https://gcc.godbolt.org/z/E4qT3sTEq
E um exemplo ainda mais complexo parece funcionar corretamente com estes dois compiladores:
struct A {
int i;
constexpr A(int v) : i(v) {}
constexpr A(const A&&);
};
constexpr int f() {
A a(1);
A b = static_cast<const A&&>( a );
return b.i;
}
constexpr A::A(const A&&) = default;
static_assert( f() == 1 );
Mas o MSVC ainda não gosta disso:
error C2610: 'A::A(const A &&)': is not a special member function or comparison operator which can be defaulted
<source>(13): note: the argument must be a non-const rvalue reference
assim como Clang:
error: the parameter for an explicitly-defaulted move constructor may not be const
Demonstração online: https://gcc.godbolt.org/z/6W9W865vG
Alguma coisa mudou nos últimos 8 anos nessa relação? Qual implementação está correta agora?