thingol:
Não é que sejam "ausentes" em Java; apenas a palavra-chave "inline" não existe em Java.
Acho que também vale citar que, na maior parte dos casos, o compilador é mais eficiente para descobrir o que pode ser inlined do que os seres humanos. Aliás, boa parte dos compiladores modernos simplesmente ignora a palavra reservada e faz ele mesmo o inlining.
O java só oficializou isso.
O que me irrita profundamente no C++ é que o compilador é extremamente burro em alguns aspectos (geralmente herdados do C) e inteligentíssimo em outros (templates). Por exemplo, muito chato você ter que dar diretivas de compilação para resolver referências cíclicas em headers.
Também não gosto do fato do int (e outros tipos primitivos) não terem um tamanho padrão. Já tentaram combinar 2 bibliotecas multi-plataforma numa única aplicação? Você acaba com 2 defines uint32 que fazem exatamente a mesma coisa. Claro, isso é porque o int tem o tamanho padrão de "uma palavra". Mas isso já não ocorre com o long que, depois da entrada dos 64 bits, ficou realmente exotérico.
Ah sim, não dá para esquecer também que por padrão os construtores do C++ operam de maneira implícita. Ou seja, uma classe com um construtor que recebe um único valor pode trabalhar assim:
class Rational
{
double value;
public Rational (double _value) : value(_value)
{
}
//blablabla
}; //<-- esse ; também é fonte de irritação
void calcula(Rational x) {
//faz qualquer calculo
}
Rational x = 2; //Construção implícita
calcula(10.2); //Construção implícita
Para forçar a construção explícita, você deve colocar a palavra "explicit" antes do construtor.
Deixando de reclamar um pouco, eu gosto muito da forma como o C++ lida com constness. É um pouco chato de programar, mas é um recurso que acho muito bacana.