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

Max*_*hof 9 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>;
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/cvV59J

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

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

C++11 标准(选择一个)向我表明捕获this需要使用 ODR this( [expr.prim.lambda]/11)。我不知道这里是如何发生的,但我之前对模板名称查找的技术细节感到惊讶。


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

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

这应该表明捕获默认值不会单方面捕获this.


因此,在我使用 linter 提交错误之前,我想确保:
上面的 lambda 是否隐式捕获this

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