这个lambda是否隐式捕获了“ this”?

时间:2020-05-14 10:17:08

标签: c++ lambda language-lawyer

我的linter声称以下代码中的lambda隐式捕获this(并且希望明确指定该捕获)。正确吗?

template <class X>
struct OtherTemplate
{
  static X bar()
  {
    return 1;
  }
};

template <class Y>
struct Test
{
  void foo()
  {
    auto lambda = [&]() {
      // return (Y)1;
      // return std::min<Y>(1, 2);
      return OtherTemplate<Y>::bar();
    };
    (void)lambda;
  }
};

// Explicit instantiation
template struct Test<int>;

https://godbolt.org/z/cvV59J

如果lambda没有默认捕获,或者使用了任何注释行,则不会有任何抱怨。从OtherTemplate删除“模板化”也不会产生诊断。

在我看来,this在lambda中没有使用。但是,以下两个问题似乎观察到了类似的行为:

C ++ 11标准(选择一个)向我表明,捕获this将需要使用this[expr.prim.lambda]/11)进行ODR。我看不到这里是怎么回事,但是以前我对模板名称查找的技术性感到惊讶。


编辑:由于评论中的讨论,我想强调标准中的以下注释,尤其是 can

this的odd隐式使用可能导致隐式捕获。

这应该清楚说明捕获默认值不会单方面捕获this


因此,在向Linter提交错误之前,我想确保:
以上lambda是否隐式捕获this

我对C ++ 17最为感兴趣,但是我希望能得到涵盖其他标准版本的答案。

0 个答案:

没有答案