Переадресация совершенных функций C ++ - PullRequest
4 голосов
/ 08 марта 2011

Это продолжение этого вопроса.

Бумага 2002 о проблеме пересылки функций в C ++ делает следующее наблюдение:

Этот метод в настоящее время используется Boost.Bind и Boost.Lambda:

template<class A1, class A2, class A3> void f(A1 & a1, A2 & a2, A3 & a3)
{
    return g(a1, a2, a3);
}

Его основной недостаток заключается в том, что он не может пересылать неконстантное значение.Вывод аргумента создает неконстантную ссылку, и ссылка не может привязываться к аргументу.Это делает невинные примеры, когда

int main()
{
    f(1, 2, 3);
}

терпит неудачу (нарушает C1).

Я вижу, что вызов не удался, но правильное ли объяснение?Разве литералы 1, 2, 3 не являются постоянными значениями?

1 Ответ

6 голосов
/ 08 марта 2011

Are not the literals 1, 2, 3 const rvalues?

Нет, это просто значения типа int. Согласно стандарту C ++ значения r примитивных типов не могут быть константно-квалифицированными.

Вызов не удался, потому что они rvalues ​​ - неконстантные ссылки не могут быть связаны с rvalues.

Вызов будет в порядке, если функции получат const A1 &, const A2&, const A3&, но в этом случае функция не сможет изменять аргументы.

Редактировать: Ссылка на мое первое утверждение из стандарта C ++ 2003: (3.10.9)

Класс rvalues ​​может иметь квалификацию cv типы; неклассовые значения всегда имеют CV-неквалифицированные типы. Rvalues ​​должен всегда есть полные типы или пустота тип; в дополнение к этим типам, Значения также могут быть неполными типы.

...