Chamando a classe Base Move CTOR [C ++ 0x
-
28-09-2019 - |
Pergunta
Qual é a maneira certa de chamar a classe base mover CTOR?
Isso (funciona no MSVC2010, mas não no CBuilder2010):
struct Foo
{
Foo(Foo&& other) { }
};
struct Bar : public Foo
{
Bar(Bar&& other) : Foo((Foo&&)other) { }
};
ou (trabalha no CBuilder2010, mas não no MSVC2010):
struct Foo
{
Foo(Foo&& other) { }
};
struct Bar : public Foo
{
Bar(Bar&& other) : Foo(&other) { }
};
Ou, ambos estão errados? Em caso afirmativo, qual é a maneira certa (em termos do que é especificado nos padrões C ++ 0x)?
Nota: Não consigo descobrir como fazê -lo funcionar no CBuilderxe (ambas as versões não funcionam).
Solução
A primeira opção parece lógica, embora eu solete std::forward<Bar>(other)
.
Eu não tenho ideia do que faz com que o CBuilder pense que o tipo de &other
é Bar&&
e não Bar*
.
Basicamente, o que está acontecendo aqui é que, uma vez que uma referência de Rvalue é nomeada, não é mais uma referência de Rvalue, é isso que std::forward
é para, ele mantém o rvaluness (para cunhar uma frase), então quando você liga : Foo(other)
Você está chamando o construtor de cópias em vez do construtor de movimentos.
Essa deve ser a maneira idiomática (e compatível com padrão) de alcançar o que você está tentando fazer (a menos que eu esteja mal entendendo mal o FCD).
Outras dicas
A primeira opção é a correta em termos do padrão- exceto que você não precisa lançá-lo e encaminhá-lo. std::forward<Bar>(other)
é a maneira correta- caso contrário, você está invocando o construtor de cópias quando deseja invocar o construtor de movimentos.