Исключая конструкторы std :: pair, использующие явную конструкцию - PullRequest
11 голосов
/ 15 ноября 2011

Исходя из этого ответа , кажется, что этим конструкторам:

template<class U, class V> pair(pair<U, V>&& p); 
template<class U, class V> pair(const pair<U, V>& p);

запрещено участвовать в разрешении перегрузки, когда им потребуется явное преобразование.

Из C ++ 11 (§20.3.2, n3290):

Примечание: Этот конструктор не должен участвовать в разрешении перегрузки, если U неявно преобразуется в first_type, а V неявно преобразуется в second_type.

Был предложен интересный SFINAE обходной путь , но это отступает от текста стандарта.

Как соответствующая реализация может исключить это из разрешения перегрузкиесли не считать какой-то особой внутренней магии компилятора?Т.е. может ли реализация сделать это, и я могу скопировать это для моего собственного типа, возможно?Похоже, что в любом случае не соответствует этому!Это похмелье от удаления концепций из C ++ 11?

Я задумался об использовании частного конструктора для выполнения части SFINAE и делегировании из открытого конструктора, но это не похоже на делегирование конструктораучаствует в SFINAE таким образом, чтобы заставить эту работу.

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011

, но это отступает от текста стандарта

Реализация позволяет добавлять аргументы по умолчанию для любой не-виртуальной функции-члена библиотеки.Это, кажется, разрешает именно этот вид трюков SFINAE.

1 голос
/ 15 ноября 2011

Мне не хватало двух частей информации:

  1. gcc использует это:

    template<class _U1, class _U2, class = typename
                   std::enable_if<std::is_convertible<_U1, _T1>::value
                                  && std::is_convertible<_U2, _T2>::value>::type>
            pair(_U1&& __x, _U2&& __y)
            : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }
    

    Кажется, что трюк по умолчанию для анонимного classпараметр шаблона.Я не видел этого раньше, и эта реализация не использовала это.

  2. Я пропустил, что gcc действительно реализовал это.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...