【问题标题】:Create temporary object as an argument on the stack [closed]在堆栈上创建临时对象作为参数[关闭]
【发布时间】:2016-08-25 15:10:45
【问题描述】:

在没有垃圾收集器指针的任何编程语言中我都可以做到

DrawLine(new Vector(0, 0), new Vector(100, 100));

但在 C++ 中,如果 DrawLine 不负责删除它的参数,我们就不能这样做,因此使用两个向量 (0,0)(100,100) 调用 DrawLine 的最短方法是:

Vector v(0, 0);
Vector w(100, 100);
DrawLine(v, w);

有没有办法把它变成一个单一的语句?特别是如果vw 只是该单个函数的参数并且没有其他函数使用它,这似乎有点冗长。为什么我不能这样做:

DrawLine(Vector(0, 0), Vector(100, 100));

【问题讨论】:

  • "为什么我不能这样做:DrawLine(Vector(0, 0), Vector(100, 100));" 因为DrawLine 愚蠢到需要左值或编译器坏了?
  • do works不能这样做的另一种情况是它在你的编码约定中被禁止。
  • @MikeCAT,谢谢!你是对的,它确实可以编译!

标签: c++ heap-memory stack-memory


【解决方案1】:

为什么我不能这样做:

DrawLine(Vector(0, 0), Vector(100, 100));

您正在尝试将临时变量作为参数传递。 3种情况下即可。

  1. 如果DrawLine接受const引用传递的参数:

    void DrawLine(const Vector& v1, const Vector& v2);

  2. 如果Vector可以被复制,并且DrawLine接受值传递的参数:

    void DrawLine(Vector v1, Vector v2);

  3. 如果Vector 可以移动,并且DrawLine 接受右值引用传递的参数:

    void DrawLine(Vector&& v1, Vector&& v2);

唯一失败的情况是通过非常量引用传递参数,因为临时变量无法绑定到它。

void DrawLine(Vector& v1, Vector& v2);

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2010-09-24
    • 2014-04-14
    • 2015-04-23
    相关资源
    最近更新 更多