Редактировать: Похоже, я неправильно вставил код в Comeau или он был отредактирован в исходном ответе, чтобы быть правильным. В любом случае я сохраняю ответ ниже, как если бы код был неправильным.
Онлайн-компилятор Comeau дает следующие результаты:
"ComeauTest.c", строка 4: ошибка: тип
спецификатор указан более одного раза
const char const * const GetName () {
вернуть m_name; } const;
^
"ComeauTest.c", строка 4: предупреждение: тип
классификатор по типу возврата
бессмысленный const char const * const
GetName () {return m_name; } const;
^
"ComeauTest.c", строка 4: ошибка:
декларация ничего не декларирует
const char const * const GetName () {
вернуть m_name; } const;
Это означает, что ваше утверждение искажено.
const char const * const GetName() { return m_name; } const;
Первые и вторые константы означают одно и то же. Вы не можете указывать один и тот же спецификатор более одного раза, поэтому один из них должен быть удален для компиляции кода. Обе эти константы указывают, что значения, на которые указывает указатель, возвращаемый GetName, не могут быть изменены, что делает код, подобный этому, недействительным:
const char* name = c.GetName();
name[0] = 'a';
Третье const указывает, что указатель, возвращаемый самим GetName (), не может быть изменен, но, как указывает Comeau, это ничего не дает для возвращаемого значения, поскольку возвращаемое значение является копией указателя, а не указателя и может быть назначен неконстантному указателю.
Четвертый const не на своем месте, он должен находиться между GetName и телом функции следующим образом:
const char* GetName() const { return m.name; }
Это const указывает, что ни один из членов класса не будет изменен во время выполнения GetName. Предполагая, что GetName является членом класса Person, этот код будет разрешен:
const Person& p;
p.GetName();
Без этого const вышеприведенный код потерпит неудачу.