C++ 当共享指针被“捕获”时发出警告;“全部通过引用”;捕获

C++ 当共享指针被“捕获”时发出警告;“全部通过引用”;捕获,c++,compiler-warnings,C++,Compiler Warnings,考虑这样一个(简化的)函数: void foo(const Bar& bar) { const auto fun = [&] () { some_other_api(bar); }; put_somewhere(fun); } 在另一个API被重构并且现在需要一个共享的ptr之前,这一切都是完美的。开发人员运行所有编译器错误并将foo更改为: void foo(std::shared_ptr<const Bar> bar) { const auto f

考虑这样一个(简化的)函数:

void foo(const Bar& bar)
{
  const auto fun = [&] () { some_other_api(bar); };

  put_somewhere(fun);
}
在另一个API被重构并且现在需要一个共享的ptr之前,这一切都是完美的。开发人员运行所有编译器错误并将foo更改为:

void foo(std::shared_ptr<const Bar> bar)
{
  const auto fun = [&] () { some_other_api(bar); };

  put_somewhere(fun);
}
void foo(std::shared_ptr bar)
{
const auto fun=[&](){some_other_api(bar);};
把你放在某个地方(好玩);
}
以及BAAAMM应用程序故障(希望在测试期间)。现在,如果没有编译器的支持,很难找到所有位置


这里的问题是,通过引用捕获所有变量通常是在有许多变量和大型函数的地方完成的,因此这种反模式很容易被忽略。如果像这样捕获共享指针,有没有办法强制执行警告?

共享指针与此上下文中的任何其他类型真的不同吗?通过引用传递
共享指针将解决此问题。但是,这可能不是一个选项?我想这一更改带来的问题不是因为使用了
共享\u ptr
,而是因为您将参数从引用类型更改为值类型。您是否考虑过捕获共享指针不是通过引用(
[&]
),而是通过值(
[=]
)相反?@Aconcagua这正是重点。引用捕获是无意的,这种情况源于这种疏忽。