Вот fragment кода:
#include #include #include template class Wrapper { public: T& t; explicit Wrapper2( T& obj ) : t(obj) {} }; class Car { public: std::string color; std::string name; Car(){} Car( std::string colorIn, std::string nameIn ) : color( colorIn ), name( nameIn ){} }; int _tmain( int iNumArguments, _TCHAR* pArgumentText[] ) { typedef Wrapper car; // Create 2 Containers std::vector collection1; std::vector collection2; // Populate collection 1 with reference objects collection1.push_back( Car("black", "Ford") ); collection1.push_back( Car("white", "BMW") ); collection1.push_back( Car("yellow", "Audi") ); // use referenced object at index 0 in collection 1 // to populate index 0 of collection 2 collection2.push_back( collection1[0] ); // Print Out index 0 of collection2's referenced object's fields std::cout << collection2[0].t.color << " " << collection2[0].t.name << std::endl; // Change collection2's index 0 referenced object's fields collection2[0].t.color = std::string( "green" ); collection2[0].t.name = std::string( "Gremlin" ); // Print out collection1's index 0 referenced object's fields // and they are changed std::cout <color << " " <name << std::endl; return 0; }
Это делает компиляцию, сборку и запуск в MSVS2015 CE без ошибок.
Это или может генерировать неопределенное поведение, и если это так; Как?
Будет ли создание шаблона шаблона шаблона ссылочной причины неопределенным поведением?
Нет.
Однако злоупотребление ссылками (и указателями и iteratorами) вообще. Если ссылочный объект уничтожен, эта ссылка остается висящей. Это происходит со всеми ссылками, а не только с обернутыми в classе – обертка не имеет никакого эффекта. Когда ссылка висит, использование ее имеет неопределенное поведение.
collection1.push_back( Car("black", "Ford") );
Здесь объект временно. Объект существует до конца push_back
. После этого ссылка в обертке в векторе свисает.
std::cout << collection2[0].t.color << " " << collection2[0].t.name << std::endl;
Здесь вы используете обвисшую ссылку, и программа имеет неопределенное поведение.
Вот пример использования обертки, у которой нет UB:
Car c; collection1.push_back(c); collection1[0].color = "black";