【发布时间】:2017-06-14 12:49:41
【问题描述】:
免责声明:我是 C++ 新手。
我有一个这样的代码块:
using BucketType = std::unordered_set<Bucket, BucketHash, BucketEqual>;
const BucketType& Range::buckets(int64_t value) {
BucketType buckets;
...
return std::move(buckets);
}
调用者这样调用这段代码:
Range range;
auto buckets = range.buckets(11);
问题:
当我像上面的代码一样返回存储桶的引用时,buckets.size() 给出了140732261909672 但是,我只在我的实际逻辑中添加了 2 个存储桶。当我将代码更改为返回值而不是引用时,它工作得非常好。
有关此代码可能有什么问题的任何指针?
【问题讨论】:
-
尝试从
buckets的返回类型中删除&。 -
不要使用
std::move来返回值,除非在极少数情况下它确实是最好的。如果可能的话,不仅返回值会被移出,使用std::move实际上会阻止 (N)RVO 的更好结果。现在这通常适用于按值返回而不是按引用。我不确定您希望这个返回值的行为是什么。 -
短版:不要使用
std::move,除非您知道它的作用和使用方法。 -
还有一个更短的版本:不要返回对自动范围内的对象的引用。这总是一个错误(除非从未使用过引用,但在这种情况下,返回它是没有意义的)。