c++ - tipos - especificacion detallada de casos de uso
¿Hay algún caso de uso real para los calificadores de referencia de la función? (2)
Recientemente aprendí sobre function''s reference qualifiers
, por ejemplo,
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
Donde podría necesitar esta función, ¿hay algún caso de uso real para esta función de idioma?
Donde podría necesitar esta función, ¿hay algún caso de uso real para esta función de idioma?
El ejemplo que muestra es bastante inútil, es más útil cuando tiene una función sobrecargada, una versión que funciona con valores de l y otra que funciona con valores de r.
Considere un tipo un poco como std::stringstream
que posee una cadena y la devuelve por valor. Si el objeto es un rvalor, puede mover la cadena en lugar de copiarla.
class StringBuilder
{
public:
std::string get() const& { return m_str; }
std::string get() && { return std::move(m_str); }
private:
std::string m_str;
};
Esto significa que cuando devuelve un StringBuilder
desde una función y desea obtener la cadena, no necesita una copia:
std::string s = buildString().get();
Más generalmente, dada una función f(const X&)
si sería útil sobrecargarla con f(X&&)
, luego dada una función miembro X::f()
podría ser útil cambiarla a X::f() const&
y sobrecargue con X::f()&&
Básicamente hay dos usos:
- Para proporcionar una sobrecarga optimizada, por ejemplo, para sacar a un miembro de un objeto temporal en lugar de tener que copiarlo.
Evitar el mal uso de una API. Por ejemplo, nadie esperaría
int a = 1 += 2;
para trabajar y esto también causaría un error de compilación. sin embargo
string b = string("foo") += "bar";
es legal si el
operator +=
se declara comostring & operator += (string const & o);
como suele ser el caso. Además, esto tiene el desagradable efecto secundario de proporcionar una referencia de valor a su valor. Mala idea. Esto se puede prevenir fácilmente declarando al operador como
string & operator += (string const & o) &;