如何访问const volatile std :: array?

时间:2018-08-31 13:18:07

标签: c++ const volatile

我正在尝试创建一个易失性数组,我需要使用运算符[]访问它。

我找不到对std :: array进行此操作的方法,但是内置数组可以正常工作。

在GCC 8.2.0中,以下内容:

#include <iostream>
#include <array>
int main()
{
    const volatile std::array<int,2> v = {1,2};
    std::cout << v[0] << std::endl ;
}

给予

<source>: In function 'int main()':

<source>:6:21: error: passing 'const volatile std::array<int, 2>' as
'this' argument discards qualifiers [-fpermissive]

 std::cout << v[0] << std::endl ;

                 ^

In file included from <source>:2:

/opt/compiler-explorer/gcc-8.2.0/include/c++/8.2.0/array:185:7: note:
in call to 'constexpr std::array<_Tp, _Nm>::value_type& std::array<_Tp, 
_Nm>::operator[](std::array<_Tp, _Nm>::size_type) [with _Tp = int; long 
unsigned int _Nm = 2; std::array<_Tp, _Nm>::reference = int&; 
std::array<_Tp, _Nm>::value_type = int; std::array<_Tp, _Nm>::size_type = 
long unsigned int]'

   operator[](size_type __n) noexcept

   ^~~~~~~~

Compiler returned: 1

同时

#include <iostream>
int main()
{
    const volatile int v[2] = {1,2};
    std::cout << v[0] << std::endl ;
}

工作正常。

如何访问const volatile std :: array?

2 个答案:

答案 0 :(得分:3)

你没有。

std::array有两个operator [](size_t)重载。 *this的一个为const,*this为非常量的一个。这些都不适合您-因为*this是常量易失的。

如果使用const_cast除去volatile限定符,则结果可能会编译,甚至可能会起作用。但是实际结果是不确定的行为(因为基础对象实际上是 易失的);这意味着当您向客户进行重要演示时,它将停止工作。

对于语言律师:n4296是C ++ 14之前标准的最后委员会草案。 7.1.6.1节[dcl.type.cv]第6段说:

  

如果试图通过使用具有非挥发性限定类型的glvalue来引用以挥发性限定类型定义的对象,则程序行为是不确定的。”

我非常确定该标准的所有版本中都存在类似的语言。


如果您使用volatile支持多线程-请不要。它实际上没有帮助。您需要使用std::atomicstd::mutex来完成。易失性对于在微处理器地址空间中对特殊寄存器进行建模很有用。

答案 1 :(得分:3)

const volatile int v[2]是两个const volatile int的数组,而不是两个int的const volatile数组。

使用类似的std::array进行编译:

int main()
{
    std::array<const volatile int, 2> w = {1,2};
    std::cout << w[0] << std::endl ;
}