Возврат значением должен обычно быть константой для невстроенных типов возврата...
Примечание: Lakos (стр. 618) приводит доводы против возвращения значения константы и отмечает, что это избыточно для builtins так или иначе (например, возвращая "интервал константы"), который он отмечает, может вмешаться в шаблонное инстанцирование.
В то время как Sutter, кажется, не соглашается относительно того, возвратить ли значение константы или значение неконстанты при возврате объекта несозданного типа значением с Lakos, он обычно соглашается, что возвращение значения константы встроенного типа (например, интервал константы) не является хорошей идеей.
В то время как я понимаю, почему это бесполезно, потому что возвращаемое значение не может быть изменено, поскольку это - rvalue, я не могу найти пример того, как это могло бы вмешаться в шаблонное инстанцирование.
Дайте мне пример того, как наличие спецификатора константы для типа возврата могло бы вмешаться в шаблонное инстанцирование.
Вот простой пример с указателями функций:
const int f_const(int) { return 42; }
int f(int) { return 42; }
template <typename T>
void g(T(*)(T))
{
return;
}
int main()
{
g(&f_const); // doesn't work: function has type "const int (*)(int)"
g(&f); // works: function has type "int (*)(int)"
}
Обратите внимание, что Visual C++ 2010 некорректно принимает оба варианта. Comeau 4.3.10 и g++ 4.1.2 корректно не принимают вызов g(&f_const)
.