Когда возвращаемый тип const мешает реализации шаблона? - PullRequest
5 голосов
/ 28 мая 2010

Из Херба Саттера Получил # 6

Возвращаемое значение должно обычно быть константным для не встроенных типов возврата. ...

Примечание: Лакос (стр. 618) выступает против возврата константного значения, и отмечает, что это все равно избыточно для встроенных (например, возвращая «const int»), который он отмечает, может мешать реализации шаблона.

Хотя Саттер, похоже, не согласен с тем, возвращать ли константное значение или неконстантное значение при возврате объекта не встроенного типа по значению с помощью Lakos, он, как правило, соглашается с тем, что возвращает константное значение встроенного типа например, const int) не очень хорошая идея.

Хотя я понимаю, почему это бесполезно, поскольку возвращаемое значение не может быть изменено, поскольку оно является r-значением, я не могу найти пример того, как это может помешать созданию экземпляра шаблона.

Пожалуйста, дайте мне пример того, как наличие спецификатора const для возвращаемого типа может повлиять на создание шаблона.

1 Ответ

3 голосов
/ 28 мая 2010

Вот простой пример с указателями на функции:

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

...