为什么互斥引用上的 lock_guard 会产生 C26110

Why does a lock_guard on a mutex reference produce C26110

Visual Studio Professional 2019 项目(版本 16.3.6)中的以下代码会产生警告:

#include <thread>
#include <future>

class Foo {
public:
    mutable std::recursive_mutex _writingMutex;
    std::recursive_mutex& writingMutex() const { return _writingMutex; }
};

int main()
{
    Foo a;
    std::lock_guard<std::recursive_mutex> lock(a.writingMutex()); // produces C26110
    std::lock_guard<std::recursive_mutex> lock2(a._writingMutex); // no warning
}

第一个锁产生警告 C26110:

Warning C26110 Caller failing to hold lock 'lock' before calling function 'std::lock_guard::~lock_guard'

为什么会这样?传递互斥体作为参考不起作用吗?

根据Alan的编译结果和rustyx的评论,我来回答我自己的问题:

这很可能是 Visual Studio 中的代码分析错误。看起来 C26110 无法通过引用识别互斥量。该问题已报告 here,我在此处添加了我的最小示例作为评论。这个问题在最新版本 16.3.7 中也仍然存在