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

cod*_*nia 5 c++ templates visual-studio-2010

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Ctor
const Ctor
Dtor
Dtor
Run Code Online (Sandbox Code Playgroud)

如果我在vs2005中构建,则得出以上输出.

但是,vs2010的输出与vs2005不同

Ctor
T Ref
Dtor
Dtor
Run Code Online (Sandbox Code Playgroud)

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


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

Joh*_*itb 6

Foo(_ty & val)_ty存在Foo是一个更好的比赛,因为这将有参数类型Foo&相匹配的非const Foo左值,而其他有一个const,这将使它有点糟糕的比赛.

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