volatile and const volatile std::tuple and std::get
volatile and const volatile std::tuple and std::get
查看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元组,但不能访问它们的元素。
这是预期行为还是疏忽?
非常感谢。
这不仅适用于std::get
,也适用于关系运算符或swap
。为什么swap
不支持volatile元组?因为tuple
的move构造函数不接受volatile元组。赋值运算符也是如此。实际上,当考虑整个标准库时,几乎没有任何类或模板为volatile对象提供重载1。也许在标准化和实施过程中会遇到很多麻烦;或者,拥有不稳定的类对象被认为是荒谬的。在任何一种情况下,易失性元组当前都非常不可用,并且就接口的当前状态而言,为其添加get
重载将是不一致的。
使用volatile tuple
作为类型(而不是对象)本身没有问题,可能会很有用。这一点,以及标准库中几乎所有其他类型特征也专门用于所有cv限定符的事实,导致tuple_element
和tuple_size
支持它
1通过从第17条开始在C++标准中搜索volatile
,可以很容易地检查这一点。我们会发现,除了第29条中用于原子的函数(模板)之外,没有任何功能(模板)因易失性参数而过载。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- volatile, std::sig_atomic_t, and atomic_signal_fence
- 为什么std::atomic中的所有成员函数都同时出现在有volatile和没有volatile的情况下
- std::atomic应该是volatile吗
- volatile and const volatile std::tuple and std::get