我确实有一个程序,该程序使用了限定为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,因为它不是线程安全的”的口头禅,让我们考虑一下信号处理程序的情况。
答案 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);
}