Как компилятор C++ может обнаружить неконстантное тело функции?

Наткнувшись на следующий фрагмент кода:

class Person
{
private:
    char name[10];
public:
    // this won't compile:
    char* getName_1() const {
        return name;
    }
    // this will: 
    const char* getName_2() const {
        return name;
    }
};

Мне интересно, как именно компилятор может сказать, что getName_1() не является константной функцией. Потому что внутри тела функции нет фрагмента кода, который фактически изменяет переменную-член.

Я не понимаю вопроса. getName_1()являетсяconst функция.

NathanOliver 22.07.2019 17:16

Что вы подразумеваете под компилятором, говорящим или не говорящим? Вопрос неясен. Возможно, вы захотите посетить эту страницу? stackoverflow.com/help/как спросить

SergeyA 22.07.2019 17:20

@NathanOliver Правильно, но нет фрагмента кода, который пытается изменить массив name - возвращается только его адрес. До сих пор я думал, что в каждой const-функции каждый член рассматривается как const-член и, следовательно, не может быть изменен, но, очевидно, это еще не все...

Angle.Bracket 22.07.2019 17:20
в каждой константной функции каждый член рассматривается как константный член и, следовательно, не может быть изменен Вот в чем суть. Почему вы думаете, что это нечто большее? Компилятор жалуется, что вы используете char* в качестве возвращаемого типа для getName_1. Вы не можете этого сделать, потому что в константной функции name является const char[], а не char[].
NathanOliver 22.07.2019 17:21

Понятно. Просто потому, что преобразование из const char* в char* не допускается.

Angle.Bracket 22.07.2019 17:24

Правильный. Вы не можете неявно отказаться от const, и это хорошо.

NathanOliver 22.07.2019 17:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
115
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Поскольку getName_1 помечен как const, все поля этого класса рассматриваются как константы.

Итак, тип name в getName_1 — это const char[10].

Его нельзя неявно преобразовать в char * (тип возвращаемого значения), поэтому компилятор сообщает об ошибке.

getName_1()является является константным методом, так как он буквально помечен как const в своем объявлении. Это означает, что его неявный указатель this равен const, поэтому член name обрабатывается как const, и поэтому getName_1() не может вернуть указатель непостоянный на данные константа, поэтому он не будет компилироваться.

В дополнение к другим (правильным) ответам это компилируется:

class Person
{
private:
    char* name;
public:
    // this compiles:
    char* getName_1() const {
        return name;
    }
};

Более всего это показывает, что вопреки популярному мифу массив в C++ — это нет указатель.

Не могли бы вы расширить?! Звучит интересно, но я не совсем понимаю причину.

dangom 22.07.2019 17:46

Здесь нет особых рассуждений. Модификатор const в функции-члене рассматривает все члены как const, поэтому name становится char* const name. Ничто не мешает вам создать еще один неконстантный указатель и присвоить ему значение константного указателя name.

SergeyA 22.07.2019 18:00

Другие вопросы по теме