模板类型扣除std :: pair的行为改变? (不,显式关键字错误)

时间:2012-10-31 13:40:36

标签: c++ visual-c++ stl c++11 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:&#39; lvalref_test&#39; :无法转换参数1   &#39;的std ::对&LT; _Ty1,_Ty2&GT;&#39;到&#cos; const SCPair&amp;&#39;

我已经看过两个

中std :: pair实现之间的区别

VS2005

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

vs2012

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关键字并且潜入了机制....

1 个答案:

答案 0 :(得分:3)

它不应该编译。您的构造函数需要显式构造,但通过尝试隐式转换对,您尝试执行隐式转换。严格来说,这不应该编译。

VS2005的行为不足 - 无论是因为标准缺陷还是因为它们有缺陷。 VS2012中的行为是正确的。