es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Confusión sobre la deducción del tipo de retorno con desempaquetado de referencias.

El siguiente código

#include <functional>
#include <tuple>
#include <iostream>

struct Point
{
    int x;
    int y;
};

decltype(auto) memrefs(Point &p)
{
    return std::make_tuple(std::ref(p.x), std::ref(p.y));
}

int main()
{
    Point p;
    auto& [x, y] = memrefs(p);
    x = 1;
    y = 2;
    std::cout << p.x << " " << p.y << std::endl;
    return 0;
}

no compila. Informado por GCC 8.1.0:

error: no se puede vincular la referencia lvalue no constante de tipo ‘std::tuple<int&, int&=””>&’ a un valor rvalue de tipo ‘std::tuple<int&, int&=””>’

Sin embargo, compilará si cambio

auto& [x, y] = memrefs(p);

a

auto [x, y] = memrefs(p)

Mi pregunta es, ¿por qué? ¿No son x e y referencias?</int&,></int&,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual cambiar auto& [x, y] = memrefs(p); a auto [x, y] = memrefs(p) se compila es porque std::make_tuple() devuelve un rvalor, el cual no puede ser ligado a una referencia a un lvalor. Al remover los ampersands (&) en auto [x, y], el compilador deduce automáticamente que x e y deberían ser copias de los valores en la tupla, en lugar de referencias a estos.

    Por lo tanto, al utilizar auto [x, y] = memrefs(p), se crean copias de p.x y p.y, las cuales son almacenadas en x e y, respectivamente. Estas copias pueden ser modificadas sin afectar los valores originales de p.x y p.y.

Comments are closed.