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);
}
我有一个使用 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);
}