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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top