Boxing implícita de tipos de valor
A conversão boxing dos tipos de valor foi alterado a partir de Managed Extensions for C++ para Visual C++ 2010.
Design de linguagem, podemos impostas uma posição filosóficas no lugar de uma experiência prática com o recurso e, na prática, era um erro. Como uma analogia no original vários design de linguagem de herança, Stroustrup decidiu que não foi possível inicializar um sub-object da classe base virtual dentro de um construtor de classe derivada, e, portanto, o idioma necessário que qualquer classe que serve como uma classe base virtual deve definir um construtor padrão. É esse construtor padrão que deve ser chamado por qualquer derivação virtual subseqüente.
O problema de uma hierarquia de classe base virtual é que a responsabilidade para a inicialização do sub-object virtual compartilhada desloca com cada derivação subseqüente. Por exemplo, se definir o uma classe base para a qual inicialização requer a alocação de um buffer, o tamanho do buffer especificado pelo usuário pode ser passado como um argumento para o construtor. Se depois, forneço duas derivações de virtuais subseqüentes, chamá-los inputb e outputb, cada um fornece um valor específico para o construtor de classe base. Agora, quando eu derivado de um in_out classe a partir de ambos inputb e outputb, nenhum desses valores para o sub-object da classe de base virtual compartilhada podem ser facilmente permitidos para avaliar.
Portanto, no design do idioma original, Stroustrup não permitida a inicialização explícita de uma classe base virtual dentro da lista de inicialização de membro do construtor de classe derivada. Enquanto isso resolveu o problema, na prática, a incapacidade para direcionar a inicialização da classe base virtual provou impracticable. Gorlen de Keith da National Institute de integridade, que tinha implementado uma versão freeware da biblioteca de coleção SmallTalk, chamada nihcl, foi uma voz de princípio em convencer Stroustrup que ele tinha para inventar um design mais flexível do idioma.
Um princípio de design hierárquico de orientada a objeto mantém que uma classe derivada deve se preocupar apenas com a implementação de não-particulares de suas classes base imediatas. Para um projeto de inicialização flexíveis de suporte para herança virtual, Stroustrup precisou violar esse princípio. Classe derivada de mais de uma hierarquia assume a responsabilidade por todas as inicialização de sub-object virtual independentemente de como profundidade na hierarquia que ele ocorre. Por exemplo, inputb e outputb são responsáveis por explicitamente Inicializando sua classe. base virtual imediata Quando in_out deriva de ambos inputb e outputb, in_out torna-se responsável pela inicialização da classe base virtual uma vez removida e a inicialização explicitado dentro de inputb e outputb é suprimida.
Isso fornece a flexibilidade necessária por desenvolvedores de idioma, mas ao custo de uma semântica complicada. Essa obrigação de complicação é eliminada longe se podemos restringir uma classe base virtual sem estado e simplesmente permiti-lo especificar uma interface. Este é um idioma de design recomendado dentro do C++. Dentro da programação do CLR, ele é disparado a diretiva com o tipo de Interface.
Aqui está uma sample– de código simples e, nesse caso, a conversão boxing explícita é desnecessário:
// Managed Extensions for C++ requires explicit __box operation
int my1DIntArray __gc[] = { 1, 2, 3, 4, 5 };
Object* myObjArray __gc[] = {
__box(26), __box(27), __box(28), __box(29), __box(30)
};
Console::WriteLine( "{0}\t{1}\t{2}", __box(0),
__box(my1DIntArray->GetLowerBound(0)),
__box(my1DIntArray->GetUpperBound(0)) );
Como você pode ver, há muito boxing acontecendo. Em Visual C++ 2010, tipo de valor boxing é implícita:
// new syntax makes boxing implicit
array<int>^ my1DIntArray = {1,2,3,4,5};
array<Object^>^ myObjArray = {26,27,28,29,30};
Console::WriteLine( "{0}\t{1}\t{2}", 0,
my1DIntArray->GetLowerBound( 0 ),
my1DIntArray->GetUpperBound( 0 ) );