模板功能的优先级在vs2005和vs2010之间是不同的

时间:2010-12-13 10:04:28

标签: c++ visual-studio-2010 templates

class Foo
{
 friend class SquirrelVM;
public:
 Foo() { cout << "Ctor" << endl; }
 virtual ~Foo() { cout << "Dtor" << endl; }
 Foo(const Foo & o) { cout << "const Ctor" << endl; }

 template <typename _ty>
 Foo(const _ty & val) { cout << "T const Ref" << endl; }
 template <typename _ty>
 Foo(_ty & val) { cout << "T Ref" << endl; }
 template <typename _ty>
 Foo(_ty * val) { cout << "T Ptr" << endl; }
};

Foo CreateFoo()
{
 Foo ret;
 return ret;
}

int main( int argc, char* argv[] )
{
 Foo f = CreateFoo(); 
 return 0;
}

vs2005和2010之间的输出不同。 预期的产出是这样的..

Ctor
const Ctor
Dtor
Dtor

如果我在vs2005中构建,则会得到以上输出。

但是,vs2010的输出与vs2005的输出不一样

Ctor
T Ref
Dtor
Dtor

为什么模板功能的优先级高于vs2010中的正常功能?


[编辑] 如果在复制构造函数中省略了const,则会出现预期的输出(与vs2005相同)。如果复制构造函数的形式与推荐形式不同,是否有任何副作用?推荐表格..我的意思是...... Foo(const Foo&);而非Foo(Foo&);

1 个答案:

答案 0 :(得分:6)

Foo(_ty & val) _tyFoo的{​​{1}}是更好的匹配,因为它的参数类型Foo&匹配非常量Foo左值,而另一个有一个const会让它更糟糕。

在C ++ 0x的构成过程中以及在是否可以使用模板将类的对象复制到其自己的类类型之前存在一些混淆。最近委员会认为他们want to stop the confusion关于它并允许这样的事情。 VS2010似乎反映了这一决定。