Есть ли способ в С++ объявить, что функция не имеет побочных эффектов? Рассмотрим:
LOG("message").SetCategory(GetCategory());
Теперь предположим, что макрос LOG в релизах создает объект NullLogEntry, который имеет SetCategory(), определенный как пустая функция. Таким образом, в основном все выражение могло бы (и должно) быть оптимизировано прочь - за исключением того, что теоретически вызов GetCategory() может иметь некоторые побочные эффекты, поэтому я думаю, что компилятору не разрешено просто выбросить его.
Другим примером может быть специализированная функция, которая игнорирует некоторые (или все) ее аргументы, однако компилятору не разрешается сохранять оценку таких аргументов на сайте вызова из-за возможных побочных эффектов.
Я прав? Или могут ли компиляторы оптимизировать такие вызовы? Если нет, есть ли способ намекнуть компилятору, что эта функция не имеет побочных эффектов, поэтому, если возвращаемое значение игнорируется, тогда весь вызов может быть пропущен?