W C operator jednoargumentowy plus nazywa się jednoargumentowy operator arytmetyczny i nie można go zastosować do wskaźników (norma C, 6.5.3.3 Jednoargumentowe operatory arytmetyczne).Jaki jest powód istniejącej różnicy między C i C++ w stosunku do jednoargumentowego operatora arytmetycznego +
1 Argument jednoargumentowych + lub - operatora mają arytmetyczną typu; operatora ~, typ całkowity; z! operator, skalarny typ .
Zatem program nie kompilacji
#include <stdio.h>
int main(void)
{
int a = 10;
int *pa = &a;
printf("%d\n", *+pa);
return 0;
}
Jednakże C++ operator jednoskładnikowa, oraz mogą być stosowane do wskaźników (C++ Standard, 5.3.1 operatorzy Jednoargumentowe)
7 operand operatora unary + musi mieć wyliczenie arytmetyczne, niezablokowane , lub wskaźnik typu, a wynikiem jest wartość argumentu . Zintegrowana promocja jest wykonywana na operandach całkowych lub wyliczeniowych . Typ wyniku jest typem promowanego operandu.
Program ten pomyślnie się kompiluje.
#include <iostream>
int main()
{
int a = 10;
int *pa = &a;
std::cout << *+pa << std::endl;
return 0;
}
Jaki jest powód utrzymania tej różnicy między C i C++?
Pytanie powstało, gdy odpowiadałem na pytanie Why size of int pointer is different of size of int array?. Zamierzałem pokazać, jak przekonwertować tablicę na wskaźnik w operatorze sizeof
.
Początkowo chciałem napisać
sizeof(+array)
Jednakże wyrażenie to jest nieważne w C. Więc musiałem napisać
sizeof(array + 0)
i uważam, że jest taka różnica między C i C++ . :)
Aby zezwolić na 'auto * p = + []() {};'? ;) – Jarod42
@ Jarod42: Na pewno masz na myśli 'auto * _ = + []() {};'? –
Istotne: http://stackoverflow.com/questions/9266648/unary-onpointpoint – SingerOfTheFall