Intereting Posts
Как можно графически отобразить макет памяти из файла .map? Поддержка AIO в Linux Должен ли std :: atomic быть изменчивым? Как проверить алгебраические утверждения с помощью boost :: spirit? Как связать библиотеку с моим проектом в CodeBlocks & GCC без добавления источника библиотеки в мой проект OpenCL HelloWorld Доступ к вложенной структуре в C ++ из VBA Перегрузка оператора C ++: stl sort на векторе моего пользовательского classа Почему я не получаю правильный результат при вычислении показателя с помощью ^ в C ++? Почему FormatMessage создает только частичные сообщения для системных ошибок ERROR_SYSTEM_PROCESS_TERMINATED и ERROR_UNHANDLED_EXCEPTION? Инкремент и декрементация «classа enum» Есть ли атомный приращение с предварительными условиями проверки, что атомное значение меньше заданного значения? Как избавиться от заполнения байтов между элементами данных структуры Преобразование векторного iteratorа в указатель В Boost ASIO, как я могу установить IP-адрес источника для олицетворения IP-адреса другого сервера?

Будет ли создание шаблона шаблона шаблона ссылочной причины неопределенным поведением?

Вот 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";