c ++: функция volatile в экземпляре volatile - присвоение массива указателю является недопустимым преобразованием? - PullRequest
3 голосов
/ 01 октября 2019

Рассмотрим следующий пример:

#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*'?

1 Ответ

2 голосов
/ 01 октября 2019

Волатильность и постоянство не распространяются через указатели, но они распространяются через массивы. Таким образом, в энергозависимом экземпляре класса firstElementPt сам по себе является энергозависимым, но на что он указывает, это не так. Однако элементы intArray являются летучими. Вы пытаетесь указать volatile-указатель на-non-volatile-int на volatile int. Это не разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...