clang:从互斥体初始化锁引用

clang: initialising a lock reference from a mutex

本文关键字:初始化 引用 clang      更新时间:2023-10-16

这个程序是由clang编译的:

#include <mutex>
int main() {
    std::mutex mtx;
    const std::lock_guard<std::mutex>& lock(mtx);
    return 0;
}

其他主要编译器拒绝它(我已经尝试过gcc,msvc和icc(。这是来自 gcc 的错误消息:

error: invalid initialization of reference of type ‘const 
       std::lock_guard<std::mutex>&’ from expression of type ‘std::mutex’

其他人给出了类似的错误。

叮当是对还是错?是否可以使用不涉及库类的更简单的示例来重现这一点?我已经尝试过,但无济于事。

编辑这似乎是最小的复制:

struct A {};
struct X
{
    explicit X(A&) {};
};
int main()
{
    A a;
    const X& x(a);
}

有趣的是,代替Aint确实触发了 clang 中的错误消息(这就是我最初无法重现的原因(。

我没有C++标准的相关章节和诗句;我现在只能参考转换构造函数的 Cpp 首选项(强调我的(:

使用显式说明符声明且可以使用单个参数(直到 C++11(调用的构造函数称为转换构造函数

仅在直接初始化(包括显式转换,如 static_cast(期间考虑的显式构造函数不同,转换构造函数在复制初始化期间也被视为用户定义的转换序列的一部分。

所以:

struct A {};
struct X
{
    explicit X(A const &) {};
};
int main()
{
    A a;
    const X& x1(A());                 // OK, direct init (no A object after init)
    const X& x3(a);                   // NOK, copy init
}