标准::时间::d类型的挥发性对象

Volatile objects of std::chrono::duration type

本文关键字:挥发性 对象 时间 标准 类型      更新时间:2023-10-16

我确实有一个程序,它使用可变限定的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);
}