我的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>;
如果lambda没有默认捕获,或者使用了任何注释行,则不会有任何抱怨。从OtherTemplate
删除“模板化”也不会产生诊断。
在我看来,this
在lambda中没有使用。但是,以下两个问题似乎观察到了类似的行为:
C ++ 11标准(选择一个)向我表明,捕获this
将需要使用this
([expr.prim.lambda]/11
)进行ODR。我看不到这里是怎么回事,但是以前我对模板名称查找的技术性感到惊讶。
编辑:由于评论中的讨论,我想强调标准中的以下注释,尤其是 can :
this
的odd隐式使用可能导致隐式捕获。
这应该清楚说明捕获默认值不会单方面捕获this
。
因此,在向Linter提交错误之前,我想确保:
以上lambda是否隐式捕获this
?
我对C ++ 17最为感兴趣,但是我希望能得到涵盖其他标准版本的答案。