descargar - c++20




Puntero único no movible de C++ 17 (2)

Bienvenido al mundo de la deducción de tipos en C ++. Tratar

auto & p = scoped_ptr<int>(new int(5));

o

auto && p = scoped_ptr<int>(new int(5));

en lugar. Esta conferencia puede ser útil: https://www.youtube.com/watch?v=wQxj20X-tIU

Me encontré con esta respuesta Impedir el movimiento de un unique_ptr C ++ 11 . Sin embargo, al intentarlo en un compilador en línea, esto funciona con C ++ 11 (error del compilador std::move ) pero con C ++ 17, veo que el std::move continuación es exitoso. ¿No debería el compilador lanzar un error en esa línea? Además, si alguna semántica ha cambiado en C ++ 17, ¿cuál es la forma correcta de crear un unique_ptr no movible en C ++ 17 y en adelante?

template <typename T>
using scoped_ptr = const std::unique_ptr<T>;

int main()
{
    auto p = scoped_ptr<int>(new int(5));
    auto p2 = std::move(p); // should be error?
    std::cout << *p2 << std::endl; // 5
    return 0;
}

Puedes probarlo en línea here .


Tenga en cuenta que p se declara como tipo sin referencia, la parte const del argumento scoped_ptr<int>(new int(5)) se ignora en la deducción de tipo. Entonces, el resultado de la deducción de tipo para p es std::unique_ptr<int> , no const std::unique_ptr<int> (es decir, scoped_ptr<int> como esperaba).

Lo que quieras podría ser

auto& p = scoped_ptr<int>(new int(5)); // p is of type const std::unique_ptr<int>& now




unique-ptr