Когда тип возвращаемого константы препятствует созданию шаблона?

От 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).