volatile and const volatile std::tuple and std::get

volatile and const volatile std::tuple and std::get

本文关键字:volatile std and get tuple const      更新时间:2023-10-16

查看C++11标准。我可以看到std::tuple_sizestd::tuple_element的专门化是为volatileconst volatile元组提供的。

template <size_t I, class T> class tuple_element<I, volatile T>;
template <size_t I, class T> class tuple_element<I, const volatile T>;
template <class T> class tuple_size<volatile T>;
template <class T> class tuple_size<const volatile T>;

std::get不提供对volatileconst volatile元组的专门化。

我在GCC上尝试了以下代码。4.8.1

volatile std::tuple<int, int> a(1, 1);
std::cout << "a<0>=" << std::get<0>(a) << "n";

我得到错误:no matching function for call to 'get(volatile std::tuple<int, int>&)'

因此,如果我理解我可以创建(const)volatile元组,但不能访问它们的元素。

这是预期行为还是疏忽?

非常感谢。

这不仅适用于std::get,也适用于关系运算符或swap。为什么swap不支持volatile元组?因为tuple的move构造函数不接受volatile元组。赋值运算符也是如此。实际上,当考虑整个标准库时,几乎没有任何类或模板为volatile对象提供重载1。也许在标准化和实施过程中会遇到很多麻烦;或者,拥有不稳定的类对象被认为是荒谬的。在任何一种情况下,易失性元组当前都非常不可用,并且就接口的当前状态而言,为其添加get重载将是不一致的。

使用volatile tuple作为类型(而不是对象)本身没有问题,可能会很有用。这一点,以及标准库中几乎所有其他类型特征也专门用于所有cv限定符的事实,导致tuple_elementtuple_size支持它


1通过从第17条开始在C++标准中搜索volatile,可以很容易地检查这一点。我们会发现,除了第29条中用于原子的函数(模板)之外,没有任何功能(模板)因易失性参数而过载。