Всякий раз, когда оптимизация компилятора включена (и в большинстве компиляторов, даже если оптимизация отключена ), будет выполняться RVO. NRVO немного менее распространен, но большинство компиляторов также выполнят эту оптимизацию, по крайней мере, когда оптимизация включена.
Вы правы, оптимизация является довольно простой для выполнения компилятором, поэтому компиляторы почти всегда делают это. Единственные случаи, когда это «невозможно сделать» - это случаи, когда оптимизация не применяется: RVO применяется только при возврате неназванного временного объекта. Если вы хотите вернуть именованную локальную переменную, вместо этого применяется NRVO, и хотя компилятор немного сложнее реализовать, это выполнимо, и у современных компиляторов с этим нет проблем.