Использование значения Rvalue в примере реализации is_copy_asignable

Я смотрю выступление Уолтера Брауна на CppCon 2014 "Современное шаблонное метапрограммирование: сборник". Во второй части он демонстрирует использование decltype и declval с примером реализации is_copy_assignable.

Вот ссылка на видео со слайдом, на котором показан исходный код (перемотайте немного, если хотите услышать его объяснения): https://youtu.be/a0FliKwcwXE?t=1576

Здесь я напечатал его реализацию в примере программы:

#include <iostream>
#include <type_traits>
#include <mutex>

using namespace std;


template <class T>
struct my_is_copy_assignable {
private:
    template<class U, class = decltype(declval<U&>() = declval<U const&>())>
    static true_type try_assignment(U&&);   // Why U&& and not for example U?

    static false_type try_assignment(...);

public:
    using type = decltype( try_assignment( declval<T>() ) );
};


int main()
{
    cout << "Is mutex copy assignable: " 
         << my_is_copy_assignable<mutex>::type() << endl
         << "Is int copy assignable: " 
         << my_is_copy_assignable<int>::type() << endl;

    return 0;
}

Мой вопрос о шаблоне функции (с комментариями):

static true_type try_assignment(U&&);

Почему он использует rvalue ссылку? Я попробовал это со ссылкой lvalue и даже параметром передачи по значению, и это, кажется, работает.

Что мне здесь не хватает?

0 ответов

Другие вопросы по тегам