Я написал некоторый код, и мне вдруг пришло в голову, что то, что я делаю, может быть действительно плохой идеей. Вот своего рода абстрактный пример. Ключевым моментом является передача по ссылке вектора.
// vector.hpp
class vector {
vector(double x, double y, double z);
}
// particle.hpp
class particle {
particle(const vector& _init_position);
vector m_position;
}
Итак, я написал код для представления class vector
, который содержит трехмерный векторный материал, а также записал класс частиц, вектор положения которого можно инициализировать с помощью конструктора и экземпляра вектора.
В моем main()
Функция, я использовал временный объект для инициализации объектов частиц, например, так:
int main() {
particle my_particle(vector(0.0, 1.0, 2.0)); // Temp vector instance - problem?
}
Здесь вы можете видеть, что создается временный экземпляр вектора, я предполагаю, что он где-то помещается в стек, а затем вызывается конструктор частицы.
Это нормально или это пример очень плохого кода? Я подозреваю, что последний, так как я передаю по ссылке, и, следовательно, экземпляр временного вектора может быть недействительным?
Надеюсь, кто-нибудь сможет уточнить это?
Вам разрешено передавать временный объект в функцию либо в качестве значения, либо в качестве ссылочного параметра const. Это хорошо, так как вы можете сохранять копии при передаче по константной ссылке.
Вы не показываете реализацию векторного конструктора, но член является значением, поэтому я предполагаю, что конструктор копирует свой аргумент в член. Если это так, то передача const ref — это именно то, что вы хотите сделать, чтобы избежать ненужных копий.
То, что вы не хотите делать, это держаться за ссылку (или адрес) этого аргумента.