siguientes sacar que perfectos perfecto para números numeros numero los lista denominan cómo algoritmo c++ forwarding c++03

c++ - sacar - numeros perfectos lista



Reenvío perfecto en C++ 03 (2)

Si tienes esta función

template<typename T> f(T&);

Y luego intente llamarlo, digamos un valor como

f(1);

¿Por qué no se deduce que T sea constante, lo que hace que el argumento sea una constante y, por lo tanto, sea vinculable a un valor?


Esto se menciona como una solución potencial en el documento que vinculé en la reciente pregunta de envío de C ++ 0x .

Funcionaría bastante bien, pero rompe el código existente. Considere (directamente del documento):

template<class A1> void f(A1 & a1) { std::cout << 1 << std::endl; } void f(long const &) { std::cout << 2 << std::endl; } int main() { f(5); // prints 2 under the current rules, 1 after the change int const n(5); f(n); // 1 in both cases }

O

// helper function in a header template<class T> void something(T & t) // #1 { t.something(); } // source #include <vector> void something(bool) // #2 { } int main() { std::vector<bool> v(5); // resolves to #2 under the current rules, #1 after the change something(v[0]); }

Esto también falla al reenviar la categoría de valor (lvalue o rvalue), que no es un gran problema en C ++ 03. Pero como esta solución solo se podía hacer durante C ++ 0x, efectivamente nos excluíamos de las referencias de valor cuando enviamos (algo malo). Debemos esforzarnos por una mejor solución.


Lo es, pero solo si declara f para tomar T const & .

template <typename T> void f(T &); template <typename T> void g(T const &); void x() { f(1); } // error: invalid initialization of non-const reference void y() { g(1); } // no error

Y si declara tanto f(T &) como f(T const &) , elegirá el cualificado por const:

template <typename T> void f(T &); template <typename T> void f(T const &); void x() { f(1); } // no error, calls f(T const &)

Tal vez esté diciendo "en el primer ejemplo, ¿por qué genera un temporal de tipo int para la llamada a f cuando podría haber generado un temporal de tipo const int y compilado el código?" La mejor respuesta que tengo para es que eso sería inconsistente con el comportamiento de resolución de sobrecarga cuando el argumento no es una constante entera.