Ciò compila perché il +
viene interpretato come più unaria, che eseguirà le promozioni integrali su tipi integrali o enumerazione e il risultato avrà il tipo dell'operando promosso.
Supponendo e
è un tipo di enumerazione integrale o senza ambito finirebbe per avere le promozioni integrali applicati comunque dato *
applica le conversioni aritmetiche abituali ai suoi operandi quali termina su alle promozioni integrali per tipi integrali.
Dalla bozza di standard C++ 5.3.1
[expr.unary.op]:
L'operando dell'operatore unario + avranno l'aritmetica, l'enumerazione senza ambito, o il tipo di puntatore e il risultato è il valore dell'argomento. La promozione integrale viene eseguita su operandi integrali o di enumerazione. Il tipo del risultato è il tipo dell'operando promosso.
Le promozioni integrali sono trattati nella sezione 4.5
[conv.prom] e se le variabili e
è un tipo diverso bool, char16_t, char32_t, or wchar_t
ed hanno conversione rango inferiore int allora sarebbe coperto dal paragrafo 1
:
una prvalue di tipo intero diverso da bool, char16_t, char32_t o wchar_t cui conversione rango (4.13) integer è inferiore alla posizione di int può essere convertito in un prvalue di tipo int se int può rep inviato nuovamente tutti i valori del tipo sorgente; in caso contrario, il valore di origine può essere convertito in un valore preregolato di tipo non firmato int.
Per un set completo di casi, è possibile consultare cppreference.
Unario plus può anche essere utile in alcuni casi per risolvere l'ambiguità, un caso interessante sarebbe da Resolving ambiguous overload on function pointer and std::function for a lambda using +.
Nota, per quelle risposte, relativi ai valori unari -
e negativi, questo è fuorviante, in quanto questo esempio mostra:
#include <iostream>
int main()
{
unsigned x1 = 1 ;
std::cout << -x1 << std::endl ;
}
che si traduce in:
4294967295
vederla dal vivo using gcc on wandbox.
E 'interessante notare che unario più è stato aggiunto al C99 per simmetria con unario meno, dal Rationale for International Standard—Programming Languages—C:
unario più è stata adottata dal Comitato C89 da diverse implementazioni, per simmetria con meno unario.
e non posso venire con un buon caso in cui casting non sarebbe sufficiente per ottenere la stessa promozione/conversione desiderata. L'esempio lambda cito sopra, usando più unario per forzare un'espressione lambda da convertire in un puntatore a funzione:
foo(+[](){}); // not ambiguous (calls the function pointer overload)
potrebbe essere realizzato utilizzando un cast esplicito:
foo(static_cast<void (*)()>([](){}));
e si potrebbe sostenere questo codice è migliore poiché l'intenzione è esplicita.
Da segnalare che Annotated C++ Reference Manual(ARM) ha il seguente commento:
più unario è un accidente storico e generalmente inutili.
Usi: http://stackoverflow.com/ a/3182557/962089 Inoltre, è possibile stampare (o usare in altro modo) il valore integrale di un tipo di carattere: 'std :: cout << + c;' Se questo accade molto, 'static_cast' ottiene molto clutaggio. – chris
Suggerimento: cosa accadrebbe se avessi intenzione di scrivere un segno meno? – imallett
Cosa succede se il tipo di 'e'? –