[英]volatile and const volatile std::tuple and std::get
看看C ++ 11标准。 我可以看到为volatile
和const volatile
元组提供了std::tuple_size
和std::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
没有为volatile
或const 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_element
和tuple_size
支持它。
1通过在第17节中的C ++标准中搜索volatile
,可以很容易地检查这一点。 人们会发现除了第29节中的原子之外,没有任何函数(模板)因为volatile参数而被重载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.