В C++ мы должны явно указывать типы принимаемых аргументов функции. Дело в том, что при вызове функции нужно как-то скопировать аргументы(или ссылки на них если мы указали &) в функцию. Для того, чтобы это сделать, компилятору надо знать что он будет копировать.
Как вариант, он мог бы об этом догадаться сам по тому, как вы вызываете функцию (что-то похожее происходит с шаблонными функциями). Однако есть проблема, что код функции может принадлежать библиотеке. Но библиотека может компилироваться отдельно и ничего не знать о том, как ее функции будут вызваны. Более того, в с++ каждый *.cpp файл компилируется отдельно, и мы не можем узнать как именно нас вызывают в другом файле.
Другой вариант -- разбираться что нам передают прямо в момент выполнения программы. По такому принципу работает python и многие другие языки с динамической типизацией. Это может быть удобно, однако на порядки медленней по сравнению с компилируемым вариантом.
Обратите внимание, что имя параметра функции никак не зависит от имени того что в нее передают. void displayMessage(string const &anyNameYouLike)//OK