我可以从引用传递的参数返回值声明const int吗?

时间:2015-12-10 20:00:58

标签: c++ lambda initialization const pass-by-reference

我想知道我是否能以某种方式将以下整数声明为const。它们的值仅在下面的函数中更改过一次。

int32_t offset_x, offset_y;
frame1.get()->enlargeForMerge(frame2.get(), offset_x, offset_y);

void SlpFrame::enlargeForMerge(const SlpFrame &frame, int32_t &os_x, int32_t &os_y)

是否有一些lambda等可以让我有这样的东西:

const int32_t offset_x, offset_y => magic[1, 2]()
frame1.get()->enlargeForMerge(frame2.get(), offset_x, offset_y);

与第一个代码的唯一区别是偏移整数从现在开始是恒定的。我看了一下lambda文档,但它超出了我的范围。

2 个答案:

答案 0 :(得分:2)

使用中间变量可以做什么。

const auto offset = [&](){
    int32_t offset_x;
    int32_t offset_y;
    frame1.get()->enlargeForMerge(frame2.get(), offset_x, offset_y);
    return std::make_pair(offset_x, offset_y);
}();
const int32_t offset_x = offset.first;
const int32_t offset_y = offset.second;

答案 1 :(得分:1)

你可以写:

struct Offset { int x, y; };

然后:

const Offset offset = bla();

您的函数返回Offset,或者您可以返回pair并将其转换为Offset或其他。

然后您可以使用offset.xoffset.y代替offset_x等。

另一种选择是:

const std::pair<int32_t, int32_t> offsets = bla();
int32_t const &offset_x = offsets.first;
int32_t const &offset_y = offsets.second;

最后,另一种选择是不使用const并继续做你正在做的事情。恕我直言,const局部变量不是常量表达式不是很好用;唯一的目的是稍后检测意外修改,但是如果你的功能如此复杂以至于你无法一眼就知道这是否正在发生,那么重构该功能可能会更好。