【问题标题】:Can I declare const int from reference passed parameter return values?我可以从引用传递的参数返回值中声明 const int 吗?
【发布时间】:2015-12-10 20:00:57
【问题描述】:

我想知道是否可以以某种方式将以下整数声明为 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 个分隔值。但如果包裹在 std::pair 或类中,这是可能的。
  • 不,你不能这样做。但是您可以使用晦涩的名称声明您的变量非常量,并在通过您的enlargeForMerge 设置它们之后立即声明一个具有正常名称的 const 引用。
  • 如果一个对象是 const,它在其整个生命周期内都是 const。任何修改它的尝试都有未定义的行为。

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


【解决方案1】:

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

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;

【讨论】:

  • 有趣的解决方案。 const auto offset 会只执行一次吗?
  • @TiiviTaavi:直接调用lambda。 offsetpair,而不是 lambda。
【解决方案2】:

你可以写:

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 不是常量表达式的局部变量不是很好用;唯一的目的是以后检测意外修改,但如果你的函数太复杂以至于你无法一眼看出是否发生这种情况,那么重构函数可能会更好。

【讨论】:

  • @RichardHodges 已修复,ty
  • 好点,这里需要 const 是有问题的。我仍然想知道这是否可以做到。
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多