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

时间:2014-11-10 22:37:06

标签: 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>;

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元组,但我无法访问它们的元素。

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

非常感谢。

1 个答案:

答案 0 :(得分:4)

这不仅适用于std::get,也适用于relational operatorsswap。 为什么swap不支持volatile元组呢?因为tuple的{​​{3}}没有采用易失性元组。同样适用于move constructor。实际上,当完整地考虑标准库时,几乎没有类或模板为易失性对象 1 提供重载。也许在标准化和实施方面会有很多麻烦;或许它被认为是无意义的,因为它具有易变的类对象。在任何一种情况下,易失性元组目前都是非常不可用的,并且就接口的当前状态而言,为它们添加get重载将是不一致的。

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


1 可以通过在第17节中的C ++标准中搜索volatile来轻松检查。人们会发现除了第29节中的原子之外,没有任何函数(模板)因为volatile参数而被重载。