Информация об изменениях

Сообщение Re[2]: cref<> in<> от 04.02.2023 17:24

Изменено 04.02.2023 18:30 rg45

Re[2]: cref<> in<>
Здравствуйте, Sm0ke, Вы писали:

S>https://cpp.godbolt.org/z/ETjzoKhKj


S>cref<T> это простой алиас на const T &


S>
S>template <typename T>
S>using cref = const T &;
S>


Тут проблемка есть: при таком определении, cref<T> — не всегда константная ссылка, например:

http://coliru.stacked-crooked.com/a/f110a7aead6d4f5d
  Код примера
#include <iostream>

template <typename T>
using cref = const T &;

template <typename T>
cref<T> make_cref(T&& t) { return cref<T>(t); }

int main()
{
    int i = 42;

    make_cref(i) = 666;

    std::cout << i << std::endl;
}

Зачем это нужно вообше? Чтоб еще больше запутать тех, кто и так путается?

S>std::array мувать смысла видимо нет, вот для него и ref<> сойдёт.


Ну, как посмотреть. Если это, например, std::array<std::unique_ptr<HardThing>, N>, то очень даже есть смысл.
Re[2]: cref<> in<>
Здравствуйте, Sm0ke, Вы писали:

S>https://cpp.godbolt.org/z/ETjzoKhKj


S>cref<T> это простой алиас на const T &


S>
S>template <typename T>
S>using cref = const T &;
S>


Тут проблемка есть: при таком определении, cref<T> — не всегда константная ссылка, например:

http://coliru.stacked-crooked.com/a/f110a7aead6d4f5d
  Код примера
#include <iostream>

template <typename T>
using cref = const T &;

template <typename T>
cref<T> make_cref(T&& t) { return cref<T>(t); }

int main()
{
    int i = 42;

    make_cref(i) = 666;

    std::cout << i << std::endl; // -> 666
}

Зачем это нужно вообше? Чтоб еще больше запутать тех, кто и так путается?

S>std::array мувать смысла видимо нет, вот для него и ref<> сойдёт.


Ну, как посмотреть. Если это, например, std::array<std::unique_ptr<HardThing>, N>, то очень даже есть смысл.