Alterações em operadores de conversão
A sintaxe para os operadores de conversão foi alterado a partir de Managed Extensions for C++ para Visual C++ 2010.
Um exemplo é gravar op_Implicit para especificar uma conversão. Aqui está uma definição de MyDouble tiradas da especificação da linguagem:
__gc struct MyDouble {
static MyDouble* op_Implicit( int i );
static int op_Explicit( MyDouble* val );
static String* op_Explicit( MyDouble* val );
};
Isso significa que, dado um número inteiro, o algoritmo para converter esse inteiro em um MyDouble é fornecida pelo op_Implicit operador. Além disso, a conversão será executada implicitamente pelo compilador. Da mesma forma, dado um MyDouble objeto, os dois op_Explicit operadores fornecem os respectivos algoritmos para converter o objeto em um número inteiro ou um gerenciado String de entidade. No entanto, o compilador não executar a conversão, a menos que explicitamente solicitada pelo usuário.
No C#, isso parece como segue:
class MyDouble {
public static implicit operator MyDouble( int i );
public static explicit operator int( MyDouble val );
public static explicit operator string( MyDouble val );
};
O código C# parece mais C++ que Managed Extensions for C++. Não é o caso em que a nova sintaxe.
O Comitê de ISO C++ introduziu uma palavra-chave, explicit, para minimizar as conseqüências indesejadas – por exemplo, um Array classe que leva a um único argumento inteiro como uma dimensão implicitamente converterá qualquer número inteiro em um Array o objeto que não é o que desejar. Uma maneira de evitar que isso é um idioma de design de um fictício segundo argumento para um construtor.
Por outro lado, você deve fornecer um par de conversão durante a criação de um tipo de classe do C++. O melhor exemplo para o que é a classe de seqüência de caracteres padrão. A conversão implícita é o construtor de argumento único, levando a uma seqüência de caracteres de estilo C. No entanto, ele não fornece o operador de conversão implícita correspondente – que, de converter uma seqüência de caracteres, o objeto para uma seqüência de caracteres de estilo C, mas em vez disso, exige que o usuário explicitamente chamar uma função nomeada – nesse caso, c_str().
Portanto, associar um comportamento explícita implícito de um operador de conversão (e como o conjunto de conversões para um único formulário de declaração de encapsulamento) parece ser uma melhoria no suporte de C++ original para operadores de conversão que eventualmente levaram a explicit palavra-chave. O Visual C++ 2010 suporte ao idioma para os operadores de conversão da seguinte maneira, parece que é um pouco menos detalhada do que C# por causa do comportamento padrão do operador com suporte para um aplicativo implícito do algoritmo de conversão:
ref struct MyDouble {
public:
static operator MyDouble^ ( int i );
static explicit operator int ( MyDouble^ val );
static explicit operator String^ ( MyDouble^ val );
};
Outra alteração é que um construtor de argumento único é tratado como se ela é declarada como explicit. Isso significa que, para acionar suas invocações, uma conversão explícita é necessária. No entanto, observe que, se um operador de conversão explícita for definido, ele e não o construtor de argumento único, é invocado.