c++: volatile 实例中的 volatile 成员函数-将数组分配给指针是无效转换吗?

标签 c++ volatile member-functions

考虑以下示例:

#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 意味着将隐藏的 *this 指针标记为 volatile。那么为什么赋值 firstElementPt = intArray; 仍然不允许并导致 error: invalid conversion from 'volatile int*' to 'int*'

最佳答案

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

关于c++: volatile 实例中的 volatile 成员函数-将数组分配给指针是无效转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58175814/

相关文章:

c++ - 类中的枚举是静态的吗?

c++ - 在具有统一初始化语法的 C++11 move 构造函数中使用 std::move

java - 对非 volatile 字段的同步访问线程安全吗?

c++ - 干净与破坏

c# - LazyInitializer.EnsureInitialized 中的 volatile 局部变量?

Java 数组 : synchronized + Atomic*, 或同步就足够了吗?

c++ - 由模板成员函数引起的错误 C2275。这段代码有错吗?

c++ - 转发成员函数的 cv-ref-qualifier

oracle - 存储过程的参数数量 PLS-00306

c++ - 是否可以使用循环对其所有类型执行类方法