Я работаю над реализацией связанного списка на С++, и мне было интересно узнать время жизни исходных данных. Допустим, вызывающая программа создает новый ListNode со следующим конструктором. Меня беспокоит то, что исходная переменная может сильно варьироваться, выходить за рамки, оставляя неопределенное поведение, ЕСЛИ назначение члена данных не является копией значения.
ListNode<T>::ListNode(const T &value) : data(value) {}
Когда значение передается данным в списке параметров, будут ли они определять данные как копию значения или член класса будет связан с исходной переменной, переданной конструктору?
РЕДАКТИРОВАТЬ: добавление дополнительной информации для ясности
list_node.hpp
template <typename T>
class ListNode
{
friend class List<T>;
public:
ListNode<T>(const T &);
private:
T data;
};
список.hpp
template<typename T>
class List
{
public:
void insert_at_front(const T &);
private:
ListNode<T> *get_new_node(const T &);
};
list.cpp
void List<T>::insert_at_front(const T &value)
{
ListNode<T> *new_node_ptr = get_new_node(value);
...
}
ListNode<T> *List<T>::get_new_node(const T &value)
{
return new ListNode<T>(value);
}
data
. - person juanchopanza   schedule 22.10.2016data
является ссылкой, это не поможет. - person Mark Ransom   schedule 22.10.2016data
. - person juanchopanza   schedule 22.10.2016std::move
. Если вы заботитесь о производительности, у вас в любом случае должны быть перегрузкиconst&
и&&
, которые работают быстрее. - person Nir Friedman   schedule 22.10.2016std::move
довольно хорошо с точки зрения производительности и избавляет от необходимости писать несколько перегрузок. Это правда, что из этого можно выжать немного больше производительности, написав эти перегрузки. Но заявление о том, что подход «передача по значению, затем перемещение» означает, что не нужно заботиться о производительности, далеко не соответствует действительности. - person AnT   schedule 22.10.2016