繁体   English   中英

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

[英]volatile and const volatile std::tuple and std::get

看看C ++ 11标准。 我可以看到为volatileconst volatile元组提供了std::tuple_sizestd::tuple_element

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 移动构造函数需要使用volatile元组。 赋值运算符也是如此 实际上,当完整地考虑标准库时,几乎没有类或模板为易失性对象1提供重载。 也许在标准化和实施方面会有很多麻烦; 或者也许它被认为是无意义的挥发性类对象。 在任何一种情况下,易失性元组目前都是非常不可用的,并且就接口的当前状态而言,为它们添加get重载将是不一致的。

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM