Приоритет функции шаблона отличается между vs2005 и vs2010 - PullRequest
5 голосов
/ 13 декабря 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;
}

Выходы различаются между 2005 и 2010 годами. Ожидаемые результаты, как это ..

Ctor
const Ctor
Dtor
Dtor

Приведенные выше результаты будут получены, если я соберу vs2005.

Но вывод vs2010 не совпадает с выводом vs2005

Ctor
T Ref
Dtor
Dtor

Почему приоритет функции шаблона выше, чем у обычной функции в vs2010?


[править] Если const опущен в конструкторе копирования, то выдается ожидаемый результат (который аналогичен vs2005) Есть ли побочный эффект, если форма конструктора копирования не совпадает с рекомендованной формой? Рекомендуемая форма .. Я имею в виду ... Foo(const Foo&); не Foo(Foo&);

1 Ответ

6 голосов
/ 13 декабря 2010

Foo(_ty & val) с _ty, являющимся Foo, является лучшим соответствием, потому что у него будет тип параметра Foo&, соответствующий неконстантному Foo lvalue, в то время как у другого есть const, который сделает немного хуже матча.

В процессе создания C ++ 0x и ранее возникла путаница относительно того, могут ли шаблоны использоваться для копирования объекта класса в его собственный тип класса. Комитет только недавно решил, что они хотят прекратить путаницу и позволить такое. VS2010, похоже, отражает это решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...