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