Я читал статью о выводе аргументов шаблона для шаблонов классов здесь http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html. Эта функция входит в стандарт C ++ 17, и некоторые вещи меня смущали.
template <typename T>
class Something {
public:
// delete the copy and move constructors for simplicity
Something(const Something&) = delete;
Something(Something&&) = delete;
explicit Something(T&&) { ... }
explicit Something(const T&) { ... }
template <typename U, typename EnableIfNotT<U, T>* = nullptr>
Something(U&&) { ... }
};
Учитывая приведенный выше код, если кто-то попытается создать экземпляр указанного выше шаблона следующим образом
auto something = Something{std::shared_ptr<int>{}};
всегда ли будет вызываться перегрузка ссылки rvalue? Поскольку набор перегрузок, рассматриваемый для вычета, равен
template <typename T>
Something<T> F(T&&) { ... }
template <typename T>
Something<T> F(const T&) { ... }
template <typename T, typename U, typename EnableIfNotT<U, T>*>
Something<T> F(U&&) { ... }
- Вторая перегрузка никогда не будет предпочтительнее первой (поскольку теперь это перегрузка ссылки пересылки, а не перегрузка ссылки rvalue), так что же здесь должно происходить?
- И похоже, что последний никогда не может быть вызван без явного указания параметра
T
, это предполагаемое поведение? - Также есть ли какие-либо другие ошибки или рекомендации по стилю, которые следует учитывать при использовании вывода аргументов шаблона для шаблонов классов?
- Кроме того, должны ли определяемые пользователем руководства по дедукции располагаться после определения класса? Например, можно ли указать конечный возвращаемый тип в объявлении конструктора класса в самом определении класса? (В отличие от конструктора итератора здесь http://en.cppreference.com/w/cpp/language/class_template_deduction)
EnableIfNotT
отсутствует (я думаю, этоstd::enable_if_t<!std::is_same<U, T>::value>
) - person Henri Menke   schedule 03.06.2017public
, и это то, что включало, если было. Я не имел в виду, что это должно быть в центре внимания вопроса. Как будет выводиться первый аргумент шаблона в третьем случае с обычным lvalue? - person Curious   schedule 03.06.2017std::decay_t
- person Curious   schedule 03.06.2017const T&
, даже если они «кажутся» лучше подходят для неконстантных lvalue. Например, wandbox.org/permlink/8KvHZXIjflD7pLXY. - person Curious   schedule 03.06.2017