标准::时间::d类型的挥发性对象
Volatile objects of std::chrono::duration type
我确实有一个程序,它使用可变限定的std::chrono::duration
对象。显然,这些对象变得非常难以使用。例如,以下简单程序产生编译错误(在 gcc 和 clang 上(:
#include <chrono>
volatile std::chrono::nanoseconds s;
void foo(std::chrono::nanoseconds k) {
s = k;
}
错误:传递"易失性纳秒"{又名"易失性" std::chrono::d uration>'} as "this"参数丢弃限定符 [-fallowive]
很明显,鉴于类的接口,我为什么会出现此错误,而且我也知道如何使用它与const_cast
一起"工作"(未定义的行为明智(。
话虽如此,std::chrono::duration
中没有具有波动性合格成员可以被视为缺陷吗?毕竟,volatile
是一个完全合法的C++结构,虽然很少使用,但它有应用。
附言我想把易失性限定的智慧排除在这个问题之外,但我的水晶球告诉我它不应该,所以为了抢占所有"你不需要易失性,因为它不是线程安全的"口头禅,让我们考虑信号处理程序的情况。
除了非常低级别的设施,std::lib 根本不真正处理volatile
。 有人可能会争辩说,chrono
是如此低级,以至于它应该处理volatile
资格。 我不知道委员会是否会接受这个论点。
人们可以绕过这样的限制。 你提到了const_cast
. 我实际上建议从底层积分类型来回转换。 这是我建议这样做的极少数情况之一。 它可以封装在一个小函数中:
#include <chrono>
volatile std::chrono::nanoseconds::rep s;
void
set_s(std::chrono::nanoseconds k)
{
s = k.count();
}
std::chrono::nanoseconds
get_s()
{
return std::chrono::nanoseconds{s};
}
void foo(std::chrono::nanoseconds k) {
set_s(k);
}
相关文章:
- 标准::时间::d类型的挥发性对象
- 什么__asm挥发性("pause" ::: "memory");男孩
- Clang vs GCC:挥发性访问的不同代码
- C 基准测试,挥发性
- 为什么挥发性不是sig_atomic_t的一部分
- 挥发性成员变量
- 自C 11以来,挥发性在并发编程中的有用性
- C++引用挥发性对象 - 原因和影响
- 错误:“命令” /重复使用ASM挥发性之前的预期字符串字母
- 在将对象声明为挥发性时,如何在C 中超载运算符
- 关于挥发性和指标点缀
- 保持嵌套类型的挥发性
- C 挥发性的合法用例
- 为什么挥发性不使用std :: min编译
- 如何初始化具有非易失性结构的挥发性结构
- 挥发性是否充当优化的编译屏障
- 是一种基本类型的挥发性初始化,可观察到的行为
- 挥发性如何与const合作
- 拒绝挥发性RVALUE到STD :: implotial rvalue的分配是错误的
- 为什么 std::atomic<bool> 比挥发性布尔值慢得多?