clang:从互斥体初始化锁引用
clang: initialising a lock reference from a mutex
这个程序是由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);
}
有趣的是,代替A
的int
确实触发了 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
}
相关文章:
- C++在构造函数处用表达式初始化引用
- 我可以从取消引用"new"的返回值初始化引用吗
- 通过用户定义的转换初始化引用
- 为什么我可以在初始化引用后重新绑定引用?
- TBB 编译器错误 -"my_task":必须初始化引用
- Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
- 为构造函数初始化引用实例变量提供默认值
- 在构造过程中获取类成员的未初始化引用是否合法
- 在C++中初始化引用
- 在动态分配的结构中初始化引用
- 使用三元运算符初始化引用变量
- 如何在 c++ 中显式初始化引用
- 初始化引用时何时以及为何获得副本
- 初始化C++引用-为什么不使用运算符的地址
- 在C++中初始化引用和变量
- 在函数参数中分配/初始化引用
- 在 C++ 中初始化引用不起作用,但初始化 const 引用有效,为什么?
- 类组合构造函数 d 必须显式初始化引用成员
- 用对tuple的引用初始化引用的元组
- 为什么在c++中不能重新初始化引用