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

Volatile objects of std::chrono::duration type

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

#include <chrono>

volatile std::chrono::nanoseconds s;

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

error: passing 'volatile nanoseconds' {aka 'volatile std::chrono::duration >'} as 'this' argument discards qualifiers [-fpermissive]

很明显为什么我在给定 class 的接口时会出现此错误,而且我也知道如何使用 const_cast 使它变得 "work"(未定义的行为明智) .

话虽如此,std::chrono::duration 的 volatile 限定成员的缺失可以被视为缺陷吗?毕竟,volatile 是一个完全合法的 C++ 构造,虽然很少使用,但有它的应用程序。

P.S。我想将 volatile-qualification 的智慧留在这个问题之外,但我的 crystal 球告诉我它不是,所以为了抢占所有 'you do not need volatile because it is not thread-safe' 咒语,让我们考虑信号的情况处理程序。

除了非常的低级设施外,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);
}