Ser*_*eyA 1 c++ volatile c++-chrono
我有一个程序,它使用volatile限定的std::chrono::duration对象.显然,这些物体变得非常难以使用.例如,以下简单程序产生编译错误(在gcc和clang上):
#include <chrono>
volatile std::chrono::nanoseconds s;
void foo(std::chrono::nanoseconds k) {
s = k;
}
Run Code Online (Sandbox Code Playgroud)
错误:使"挥发性纳秒" {又名"挥发性的std ::计时::持续时间>"}"本次"参数丢弃限定符[-fpermissive]
很明显,为什么我在给出类的接口时会出现这个错误,而且我也知道如何使用它来"工作"(未定义 - 行为明智)const_cast.
话虽如此,缺乏挥发性合格的成员被std::chrono::duration认为是缺陷吗?毕竟,这volatile是一个完全合法的C++构造,虽然很少使用,但它的应用程序.
PS我想在这个问题之外留下挥发性资格的智慧,但我的水晶球告诉我它不是,所以要先抢占所有'你不需要挥发性因为它不是线程安全的'口头禅,让我们考虑信号处理程序的情况.
除了非常低级别的设施,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);
}
Run Code Online (Sandbox Code Playgroud)