gpt4 book ai didi

c++ - std::pair 行为变化的模板类型推导? (不,显式关键字错误)

转载 作者:行者123 更新时间:2023-11-30 02:59:10 25 4
gpt4 key购买 nike

我为此使用 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 给我:

error C2664: 'lvalref_test' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'const SCPair &'

我已经研究了两者中 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 关键字并一头扎进了这个机制....

最佳答案

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

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

关于c++ - std::pair 行为变化的模板类型推导? (不,显式关键字错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13159330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com