Рассмотрим пример:
class A
{
public:
float *GetValues() const
{
return values;
}
private:
float values[10];
};
Законно ли в этом случае считать метод константным? Ведь сам он не меняет состояние класса, но предоставляет указатель на массив, и кто-то может изменить содержимое массива через этот указатель.
Нет, незаконно.
Мой GCC выдает error: invalid conversion from 'const float*' to 'float*'.
Внутри константного метода все поля (кроме mutable) считаются константными, так что values имеет тип const float [10]. Без const_cast он в float * не преобразуется.
Но если бы у вас в классе хранился не массив, а указатель - float *, то в константном методе он имел бы тип float *const (константный указатель на изменяемые float), а не const float * (изменяемый указатель на константные float). Такой указатель преобразовывался бы float * без проблем.
Чтобы метод был законно константным, нужно чуть изменить код - возвращайте из вашего метода указатель на константу (const float*), а не просто указатель (float*):
class A
{
public:
const float *GetValues() const
{
return values;
}
private:
float values[10];
};
Начнем с того, что компилятор не даст вам так просто неявно преобразовать const float[10] в float* - вам придется выполнять приведение... Но при этом вы получите сообщение о том, что нельзя преобразовать константный массив в неконстантный указатель.
Так что да - такой метод не может быть константным. И поведение компилятора, который этот код компилировать не станет, это подтверждает :)
P.S. Конечно, компилятор можно уговорить кодом наподобие
return const_cast<float*>(values);
Но тогда уже вы отвечаете за то, что возвращаемым указателем никто не воспользуется неподобающим образом...
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости