Когда тип возвращаемого константы препятствует созданию шаблона?
От Herb Sutter GotW # 6
Возвращаемое значение обычно должно быть const для нестроенных возвращаемых типов....
Примечание: Lakos (стр. 618) утверждает, что не возвращает значение const, и отмечает, что он избыточен для встроенных серверов (например, возвращающий "const int" ), который, как он отмечает, может препятствуют созданию шаблона.
В то время как Саттер, похоже, не согласен с тем, следует ли возвращать значение const или не-const при возврате объекта нестроенного типа по значению с помощью Lakos, он обычно соглашается с тем, что возвращает значение const встроенного типа ( например, const int) не является хорошей идеей.
Хотя я понимаю, почему это бесполезно, потому что возвращаемое значение не может быть изменено, так как оно является rvalue, я не могу найти пример того, как это может помешать созданию шаблона.
Пожалуйста, дайте мне пример того, как наличие атрибута const для типа возвращаемого файла может помешать созданию экземпляра шаблона.
Ответы
Ответ 1
Вот простой пример, содержащий указатели на функции:
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 С++ 2010 неправильно принимает оба. Comeau 4.3.10 и g++ 4.1.2 правильно не принимают вызов g(&f_const)
.