当前位置:  开发笔记 > 编程语言 > 正文

C++ - 如果我'返回*= b;`会发生什么?

如何解决《C++-如果我'返回*=b;`会发生什么?》经验,为你挑选了1个好方法。

所以..我写一些代码,想知道原型的复合运算符(即类似operator*=operator/=).当我查看它时,我意识到它们应该返回引用.(或者至少我的消息来源表示如下:R& operator +=(K& a, S b);.)嗯..然后我意识到我的代码中的一行可能比它看起来更危险:

// I have a really fancy Vector class I've been making. :P
template
inline Vector operator*(const Vector& vec, T scale) {
    Vector ret = vec;
    return ret *= scale;
}

所以..我想知道这是否无害......或者会导致对局部变量的引用泄漏并导致各种未定义的行为和一般的破坏.(我倾向于破坏,因此,重写如下.:P)

// I have a really fancy Vector class I've been making. :P
template
inline Vector operator*(const Vector& vec, T scale) {
    Vector ret = vec;
    ret *= scale;
    return ret;
}

所以..是啊..一般C++"怎么样?" 这里有问题.很高兴知道肯定.(而且我太懒了,不能尝试做一个测试用例,看看我的程序是否停止并着火了.:P)

编辑: 修复上面的代码..我意识到这也可能有助于将所述复合运算符放在这里.:P

template
inline Vector& operator*=(Vector& vec, T scale) {
    for (int i = 0; i < N; i++) {
        vec[i] *= scale;
    }
    return vec;
}

所以...代码更正(并经过双重检查)我想知道是否使用第一个变体仍会导致悬空引用(因为返回类型operator*=是引用).



1> Joseph Thoms..:

按照惯例,复合赋值运算符*=应该返回对它们修改的对象的引用,因为没有理由进行不必要的复制.也就是说,即使在你修改过的例子中,你也会得到一个"悬空"引用,因为你仍然会返回一个对函数返回后将被销毁的局部变量的引用.您应该按值而不是按引用返回.

template 
Vector operator*(Vector const& vec, T scale) {
    Vector ret = vec;
    return ret *= scale;
}

另请注意,ret如果您通过vec值传递,则可以删除.如果Vector可以比可以复制的更有效地移动,则这可以允许更有效的客户端代码.

template 
Vector operator*(Vector vec, T scale) {
    return vec *= scale;
}

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有