【问题标题】:c++: volatile member function in volatile instance - assigning array to pointer is invalid conversion?c ++:易失性实例中的易失性成员函数-将数组分配给指针是无效的转换?
【发布时间】:2019-09-30 22:03:41
【问题描述】:

考虑以下示例:

#include <iostream>

class C {
    int intArray[2] { 1, 2 };
    int *firstElementPt;

    public:
        int getFirstElement() volatile {
            firstElementPt = intArray;
            return *firstElementPt;
        };
};

int main()
{
    volatile C c;
    std::cout << c.getFirstElement();
}

这给了我以下编译错误:

 In member function 'int C::getFirstElement() volatile':
10:28: error: invalid conversion from 'volatile int*' to 'int*' [-fpermissive]

我是 C++ 新手。我读到将实例声明为 volatile 会隐含地使其所有成员变量都变为 volatile。我读到将成员函数声明为 volatile 意味着将隐藏的 *thispointer 标记为 volatile。那么为什么分配firstElementPt = intArray; 仍然不允许并导致error: invalid conversion from 'volatile int*' to 'int*'

【问题讨论】:

  • 作为 C++ 新手,您应该忘记volatile 的存在。你永远不需要它。
  • int * 表示指向非易失性 int 的指针。在 volatile 类中,这将是指向非 volatile int 的 volatile 指针。 s/volatile/const 也会出现同样的“问题”
  • @M.M 使用 const 没问题,无论如何你不能指定一个。
  • @n.m.从 ISR 和 Arduino 程序中的“主”代码访问的变量怎么样?那是我的用例...
  • @x-ray — volatile 不是合适的工具。有许多多线程支持类和函数。

标签: c++ volatile member-functions


【解决方案1】:

Volatility 和 constness 不会通过指针传播,但它们会通过数组传播。所以在类的 volatile 实例中,firstElementPt 本身就是 volatile,但它指向的东西不是。但是,intArray 元素是易变的。您正在尝试将 volatile-pointer-to-a-non-volatile-int 指向 volatile int。这是不允许的。

【讨论】:

  • 有没有办法让编译器将firstElementPt 视为getFirstElement() 中的一个volatile-pointer-to-a-volatile-int?
猜你喜欢
  • 2011-06-17
  • 2019-11-07
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2015-04-23
  • 2011-06-06
相关资源
最近更新 更多