Вывод типа шаблона изменения поведения std::pair? (нет, явная ошибка ключевого слова)

Я использую для этого версии Visual Studio 2005 и 2012, приведенный ниже код компилируется, и в vs2005 проблем нет, но в vs2012 возникает ошибка. Я перегнал код, над которым я работал, до приведенного ниже примера, который компилируется и запускается (в vs2005)

#include <map> 

//Arbitrary class
class SimpleClass
{
private:
     int member;

public:
     explicit SimpleClass( int i ) : member(i) {}
     operator int() const { return member;} 
};

//In code I have a map with these types and make_pair is invoked
//when an insert occurs into that map
typedef std::pair<SimpleClass,SimpleClass> SCPair;

//simple fn to replace myMap.insert(...)
void lvalref_test( const SCPair& sp )
{
    return;
}

int main( unsigned int argc, const char** argv ) 
{
     const int anInt = 2;
     //make_pair creates a pair<SimpleClass,SimpleClass> from
     //the instance of pair<int,SimpleClass> in the normal way
     //and Because SimpleClass is constructable from an int, 
     //the creation succeeds (In vs2005)
     lvalref_test( std::make_pair( anInt, SimpleClass(1) ) );
     return 0;
}

vs2012 дает мне:

ошибка C2664: 'lvalref_test': невозможно преобразовать параметр 1 из 'std::pair‹_Ty1,_Ty2>' в 'const SCPair &'

Я рассмотрел разницу между реализациями std::pair в обоих

по сравнению с 2005 годом

template<class _Other1,
    class _Other2>
    pair(const pair<_Other1, _Other2>& _Right)
    : first(_Right.first), second(_Right.second)
    {   // construct from compatible pair
    }

по сравнению с 2012 годом

template<class _Other1,
    class _Other2>
    pair(const pair<_Other1, _Other2>& _Right,
        typename enable_if<is_convertible<const _Other1&, _Ty1>::value
            && is_convertible<const _Other2&, _Ty2>::value,
            void>::type ** = 0)
    : first(_Right.first), second(_Right.second)
    {   // construct from compatible pair
    }

Я предполагаю, что enable_if вызывает изменение поведения, но я не совсем уверен, почему.

Я знаю, как исправить ошибку, которую я вижу, я могу пройти через экземпляр SimpleClass, и все в порядке. Мой вопрос здесь: должен ли он по-прежнему выводить правильные параметры шаблона и создавать правильный тип пары? Изменилось ли это поведение или я где-то ошибся?

Ответ: да, я сделал ошибку - я проигнорировал очевидное ключевое слово explicit и с головой погрузился в механизм....


person Caribou    schedule 31.10.2012    source источник


Ответы (1)


Он не должен компилироваться. Ваш конструктор требует явной конструкции, но, пытаясь неявно преобразовать пару, вы пытаетесь выполнить неявное преобразование. Строго говоря, это никогда не должно было компилироваться.

Поведение VS2005 является несовершенным - будь то из-за стандартного дефекта или из-за того, что они были дефектными. Поведение в VS2012 правильное.

person Puppy    schedule 31.10.2012
comment
Ну, я многому научился в процессе, даже если я игнорировал более простые вещи.... - person Caribou; 31.10.2012