Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;以临时对象作为参数的对象构造函数_C++_Vector_Initialization_Object Initializers_Temporary Objects - Fatal编程技术网

C++ C++;以临时对象作为参数的对象构造函数

C++ C++;以临时对象作为参数的对象构造函数,c++,vector,initialization,object-initializers,temporary-objects,C++,Vector,Initialization,Object Initializers,Temporary Objects,我写了一些代码,突然想到我正在做的可能是一个非常糟糕的主意。这是一个抽象的例子。关键点是通过向量的引用传递 // vector.hpp class vector { vector(double x, double y, double z); } // particle.hpp class particle { particle(const vector& _init_position); vector m_position; } 所以我写了一些代码来表示一个类

我写了一些代码,突然想到我正在做的可能是一个非常糟糕的主意。这是一个抽象的例子。关键点是通过向量的引用传递

// vector.hpp
class vector {
    vector(double x, double y, double z);
}

// particle.hpp
class particle {
    particle(const vector& _init_position);
    vector m_position;
}
所以我写了一些代码来表示一个
类向量
,它包含了3D向量的东西,还写了一个粒子类,它的位置向量可以用构造函数和向量实例初始化

在我的
main()
函数中,我使用了一个临时对象来初始化粒子对象,如下所示:

int main() {

    particle my_particle(vector(0.0, 1.0, 2.0)); // Temp vector instance - problem?
}
在这里,您可以看到创建了一个临时向量实例,我假设它被放置在堆栈的某个位置,然后调用particle的构造函数

这可以吗,还是一个非常糟糕的代码示例?我怀疑是后者,因为我是通过引用传递的,因此temp向量的实例可能无效


希望有人能澄清这一点?

您可以将临时对象作为值或常量引用参数传递给函数。这是一件好事,因为通过const引用传递时可以保存副本。

您没有显示向量构造函数的实现,但是成员是一个值,因此我假设构造函数正在将其参数复制到成员。如果是这种情况,那么传递常量ref正是您想要避免不必要的副本的方法


您不想做的是保留对该参数的引用(或地址)

你应该仔细阅读rval参考资料,这是完全可以的。这种事经常发生。例如,当您将
“Hello”
传递给使用
const std::string&
@igortandtnik Argh的函数时,您应该已经想到了该示例!为什么它必须是常量引用?我注意到如果没有const,它将无法编译。@EdwardBird没有技术上的原因(因为Visual Studio支持它作为扩展),这是不允许的。我相信他们认为这会鼓励糟糕的编码实践。我想这很公平。一切都必须是常数,等等。