gpt4 book ai didi

c++ - volatile 和 const volatile std::tuple 和 std::get

转载 作者:可可西里 更新时间:2023-11-01 16:40:33 25 4
gpt4 key购买 nike

查看 C++11 标准。我可以看到 std::tuple_size 的特化和 std::tuple_elementvolatile 提供和 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不提供特化 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)可变元组,但我无法访问它们的元素。

这是预期行为还是疏忽?

非常感谢。

最佳答案

这不仅是 std::get 的情况,也是 relational operators 的情况。或 swap .为什么 swap 不支持可变元组呢?因为没有 move constructor tuple 采用可变元组。同样适用于 assignment operator .实际上,当考虑整个标准库时,几乎没有类或模板为易变对象提供重载1。也许在标准化和实现方面会很麻烦;或者,拥有 volatile 类对象可能被认为是荒谬的。在任何一种情况下,volatile 元组目前都非常不可用,并且为它们添加 get 重载对于接口(interface)的当前状态来说是不一致的。

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


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

关于c++ - volatile 和 const volatile std::tuple 和 std::get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26854320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com