формата PDF статье вы связаны содержит ряд некорректных высказываний о различиях между C и C++ в их лечении CV-классификаторов верхнего уровня. Эти различия либо не существуют, либо имеют иной характер, чем это подразумевается в статье.
В действительности C и C++ эффективно игнорировать cv-квалификаторы верхнего уровня в объявлениях параметров функций, когда дело доходит до определения сигнатуры функции и типа функции. Формулировка на языках языка C и C++ (и лежащих в ее основе механизмов) может быть концептуально иной, но конечный результат на обоих языках одинаковый.
C++ действительно непосредственно игнорирует cv-квалификаторы верхнего уровня по параметрам при определении типа функции, как описано в 8.3.5/5: «После создания списка типов параметров любые cv-квалификаторы верхнего уровня, изменяющие тип параметра: удалено при формировании типа функции. "
Вместо прямого игнорирования таких классификаторов C опирается на C-специфическое понятие совместимого типа. В нем говорится, что типы функций, которые отличаются только от cv-квалификаторов верхнего уровня по параметрам, соответствуют , что для всех средств означает, что они одинаковы. В определении совместимости типа функций в 6.7.5.3/15 говорится: «При определении совместимости типов и составного типа [...] каждый параметр, объявленный с помощью квалифицированного типа, принимается как имеющий неквалифицированный вариант его объявленный тип ».
Связанный PDF статье говорится, что в C следующая последовательность объявлений является незаконным
void foo(int i);
void foo(const int i);
В действительности это совершенно законно в C. C просто требует, чтобы все заявления одного и того же лица в том же объеме, используйте совместимые типы (6.7/4). Две приведенные выше объявления соответствуют , что означает, что они просто юридически переопределяют одну и ту же функцию.(В C++ вышеуказанных заявления являются также юридическими и они также переобъявить ту же функцию.)
Дополнительных примеры, как в C и C++ следующей инициализация действительны
void foo(const int i);
void bar(int i);
void (*pfoo)(int) = foo; // OK
void (*pbar)(const int) = bar; // OK
В то же время, как C и C++ одинаково принимают во внимание cv-квалификаторы верхнего уровня, когда дело доходит до определения локального параметра параметра функции. Например, как в C и C++ следующий код плохо сформированный
void foo(const int i) {
i = 5; // ERROR!
}
В обоих C и C++ функция объявлена с одним верхнего уровня CV-квалификации по своим параметрам могут быть впоследствии определен с совершенно другой сорта -квалификация его параметров. Любые различия в квалификации высшего уровня не представляют собой перегрузку функций на C++.
Кроме того, вы неоднократно говорили, что char *[]
интерпретируется как char **
как нечто актуально. Я не вижу актуальности. В списках параметров функции T []
декларации всегда эквивалентны объявлениям T *
. Но это не имеет никакого отношения к квалификаторам верхнего уровня.
Между тем образец кода в вашем редакторе не может скомпилироваться по причине, которая не имеет никакого отношения к квалификаторам верхнего уровня верхнего уровня. Он не компилируется, потому что нет никакого неявного преобразования от char **
до const char *const *
на языке C. Обратите внимание, что это преобразование не связано и не заботится о каких-либо отборочных классах верхнего уровня. Квалификаторы const
, которые влияют на это преобразование, присутствуют только на первом и втором уровнях косвенности.
Это действительно связано с различием между C и C++. В C и C++ неявное преобразование от char **
к const char **
запрещено (см., Например, here). Однако C++ допускает неявное преобразование от char **
до const char *const *
, в то время как C по-прежнему не работает. Вы можете больше узнать об этом here. Но, опять же, обратите внимание, что во всех этих случаях cv-квалификаторы верхнего уровня совершенно неактуальны. Они не играют никакой роли.
Ваш пример ARGV на самом деле то, что C++ унаследовал от C. Ваших PDF переговоров о * подписях *, они имеют значение только для разрешения перегрузки. Не имеет ничего общего с проверкой cv. –
@HansPassant для меня, этот механизм по-прежнему оставляет мой 'const', если он присутствует на верхнем уровне, и я хотел бы знать, в чем причина этого странного поведения. 'argv' - это просто игрушка в этом примере. – user2485710
Юмор нам с конкретным примером, пожалуйста. –