【问题标题】:clang: initialising a lock reference from a mutexclang:从互斥锁中初始化锁引用
【发布时间】:2017-11-13 12:41:42
【问题描述】:

本程序由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’

其他人给出类似的错误。

clang 是对还是错?这可以用一个不涉及库类的更简单的例子来重现吗?我试过了,但没有用。

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

struct A {};

struct X
{
    explicit X(A&) {};
};

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

有趣的是,int 代替 A 确实会在 clang 中触发错误消息(这就是我最初无法重现此内容的原因)。

【问题讨论】:

    标签: c++ g++ clang


    【解决方案1】:

    我没有C++标准的相关章节;我现在只能参考CppReference on Converting Constructors(强调我的):

    使用说明符显式声明且可以使用单个参数(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
    }
    

    【讨论】:

    • @n.m.:我没有资格打那个特定的电话。以上只是我自己解释错误信息的方式;我将把判断留给上级... ;-)
    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2021-06-11
    • 2013-01-15
    • 2020-08-07
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多