该程序由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);
}
有趣的是,代替int
的{{1}}会触发clang中的错误消息(这就是我最初无法重现的原因)。
答案 0 :(得分:2)
我没有C ++标准的相关章节和章节;我现在只能提到CppReference on Converting Constructors(强调我的):
使用显式说明符声明的不的构造函数,可以使用单个参数调用(直到C ++ 11)称为转换构造函数。< / p>
与显式构造函数不同,仅在直接初始化期间考虑 (包括显式转换,如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
}