我正在尝试创建一个volatile数组,我需要使用operator []访问它。
我发现没有办法为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?
你没有。
std::array
有两个operator [](size_t)
超载。 *this
的一个是const,如果*this
是非const的话。这些都不适合你 - 因为*this
是不稳定的。
如果使用const_cast
删除volatile限定符,结果可能会编译,甚至可能看起来有效。但实际结果是未定义的行为(因为底层对象实际上是不稳定的);这意味着当您向客户进行重要演示时,它将停止工作。
语言律师:n4296是C ++ 14之前标准的最后委员会草案。第7.1.6.1节[dcl.type.cv]第6段说:
如果尝试通过使用具有非volatile限定类型的glvalue来引用使用volatile限定类型定义的对象,则程序行为未定义“。
我很确定该标准的所有版本都存在类似的语言。
如果你使用volatile
来支持多线程 - 请不要。它实际上没有帮助。你需要使用std::atomic
或std::mutex
来做到这一点。易失性对于在微处理器地址空间中建模特殊寄存器很有用。
const volatile int v[2]
是两个const挥发性int
s的数组,而不是两个int
s的const volatile数组。
使用类似的std::array
编译:
int main()
{
std::array<const volatile int, 2> w = {1,2};
std::cout << w[0] << std::endl ;
}