std :: chrono :: duration类型的易失对象

时间:2018-10-02 21:28:22

标签: c++ volatile chrono

我确实有一个程序,该程序使用了限定为volatile的std::chrono::duration对象。显然,此类对象变得非常难以使用。例如,以下简单程序会产生编译错误(在gcc和clang上):

#include <chrono>

volatile std::chrono::nanoseconds s;

void foo(std::chrono::nanoseconds k) {
    s = k;
}
  

错误:传递“ volatile纳秒” {aka'volatile   std :: chrono :: duration>'} as   'this'参数舍弃了限定词[-fpermissive]

很明显为什么在给定类接口的情况下会出现此错误,并且我也知道如何使用const_cast使它“正常工作”(行为不确定)。

已经说过,std::chrono::duration的不具有挥发成分的成员是否可以视为缺陷?毕竟,volatile是完全合法的C ++构造,尽管很少使用,但它具有应用程序。

P.S。我想将volatile资格的智慧排除在这个问题之外,但我的水晶球告诉我这不是事实,因此,请先考虑所有“您不需要volatile,因为它不是线程安全的”的口头禅,让我们考虑一下信号处理程序的情况。

1 个答案:

答案 0 :(得分:5)

除了很多低级设施外,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);
}