我的理解是std :: mutex锁定和解锁具有获取/释放语义,这将防止它们之间的指令被移到外面.
因此,获取/释放应禁用编译器和CPU重新排序指令.
我的问题是我看一下GCC5.1代码库,并没有看到std :: mutex :: lock/unlock中的任何特殊内容,以防止编译器重新排序代码.
我在do-pthread-mutex-lock-have-happen-before-semantics中找到了一个潜在的答案,它表示一个外部函数调用充当编译器内存栅栏的邮件.
它总是如此吗?标准在哪里?
考虑:
enum class Number {one, two};
if (Number::one < Number::two)
{}
Run Code Online (Sandbox Code Playgroud)
我的理解是,scoped枚举需要被包装到底层类型或整数中,然后它可以应用于operator <> ==.但看起来上面的代码片段可以在没有任何显式重载运算符的情况下工作<.
我在枚举声明中没有看到任何描述.
C++标准说明默认情况下哪个运算符支持作用域枚举?
[Effective modern C++]中的第34项给出了一个示例,嵌套绑定可以推迟对steady_clock::now()until的评估setAlarm.
std::chrono::steady_clock::now实际上是一个static成员函数.我的理解是,只要它作为函数参数传递,它就会被评估.
任何人都可以帮助详细说明为什么可以延期?
auto setSoundB =
std::bind(setAlarm,
std::bind(std::plus<>(), steady_clock::now(), 1h),
_1,
30s);
Run Code Online (Sandbox Code Playgroud)