查看C ++ 11标准。我可以看到为std::tuple_size
和std::tuple_element
元组提供了volatile
和const 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
不提供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元组,但我无法访问它们的元素。
这是预期的行为还是疏忽?
非常感谢。
答案 0 :(得分:4)
这不仅适用于std::get
,也适用于relational operators或swap
。
为什么swap
不支持volatile元组呢?因为tuple
的{{3}}没有采用易失性元组。同样适用于move constructor。实际上,当完整地考虑标准库时,几乎没有类或模板为易失性对象 1 提供重载。也许在标准化和实施方面会有很多麻烦;或许它被认为是无意义的,因为它具有易变的类对象。在任何一种情况下,易失性元组目前都是非常不可用的,并且就接口的当前状态而言,为它们添加get
重载将是不一致的。
将volatile tuple
用作类型(而不是对象)本身并不存在问题,可能会有用。这一点,以及标准库中几乎所有其他类型特征也适用于所有cv限定符的事实,导致tuple_element
和tuple_size
支持它。
1 可以通过在第17节中的C ++标准中搜索volatile
来轻松检查。人们会发现除了第29节中的原子之外,没有任何函数(模板)因为volatile参数而被重载。