При попытке написать обертку для shared_ptr
, которая скроет выделение и освобождение памяти от пользователя при поддержке наследующих классов, я наткнулся на очень странные ошибки, предлагая, чтобы либо компилятор искал неправильные функции во время перегрузки, или мои знания относительно смешивания перегрузок и шаблонов неверны. Так что я написал эту вещь для тестирования:Специализация по шаблону C++: неожиданный результат поиска перегрузки функции
#include <iostream>
void out(int i) {
std::cout << i << '\n';
}
template <class T>
struct Inst {
template <class TT>
Inst(const TT &) {out(1);}
Inst(const Inst &) {out(2);}
template <class TT>
Inst(TT &&) {out(3);}
Inst(Inst &&) {out(4);}
Inst() {out(-1);}
~Inst() {out(1000);}
};
class K {};
class KK : K {};
int main() {
out(3000);
K k; KK kk; Inst<K> i;
Inst<K> I1{k};
Inst<K> I2{kk};
Inst<K> I3{i};
Inst<K> I4{K()};
Inst<K> I5{KK()};
Inst<K> I6{Inst<K>()};
out(2000);
}
Что бы разумно ожидать, будет I1
и I2
писать 1
, I3
писать 2
, I4
и I5
писать 3
и I6
писать 4
, и по крайней мере два других объекта написания -1
в разных точках. Однако, когда скомпилировано gcc 4.8.2 с использованием -std=c++11
, моя машина пропустила один из объектов и написала 3
для каждого вызываемого неавтоматического конструктора. Что я делаю не так?
Я думаю, что вы столкнулись с некоторой путаницей о '&&' и "универсальных ссылках". См.: Http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers – Chad
Вы можете найти [это проще для чтения] (http://ideone.com/11NW07). – WhozCraig