volatile和const volatile std :: tuple和std :: get

use*_*465 9 c++ c++11

看看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>;
Run Code Online (Sandbox Code Playgroud)

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";
Run Code Online (Sandbox Code Playgroud)

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

所以如果我理解我可以创建(const)volatile元组但我无法访问它们的元素.

这是预期的行为还是疏忽?

非常感谢.

Col*_*mbo 4

这不仅适用于关系运算符或std::get,也适用于关系运算符swap。那为什么swap不支持易失元组呢?因为没有移动构造函数tuple采用易失性元组。赋值运算符也是如此。实际上,当从整体上考虑标准库时,几乎没有类或模板为易失性对象1提供重载。也许这会给标准化和实施带来很大麻烦;或者也许认为拥有易失性类对象是无意义的。在任何一种情况下,易失性元组目前都非常不可用,并且get为它们添加重载将与接口的当前状态不一致。

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


1volatile通过在 C++ 标准中从第 17 条开始搜索,可以轻松检查这一点。人们会发现,除了第 29 条中的原子函数(模板)之外,没有为易失性参数重载的函数(模板)。