Как указать константную ссылку на константный указатель? - PullRequest
2 голосов
/ 17 января 2012

Вероятно, концептуальная ошибка с моей стороны, но, скажем, у меня есть функция, которая принимает char * в качестве параметра; то есть строка в стиле C. Но я хочу убедиться, что char * указывает на что-то. Так что я мог бы использовать что-то вроде:

foo(const char * const &cstring)

, чтобы указать, что я ожидаю, что cstring будет const ссылкой на const char *? Таким образом, мне не нужно проверять NULL-указатели внутри foo.

Ответы [ 4 ]

4 голосов
/ 17 января 2012

То, что вы написали, гарантирует, что сама ссылка связана с действительным указателем, который может все же быть нулевым. Нет времени компиляции, чтобы делать то, что вы хотите.

Лучший вариант - не использовать C-строки, а взять std::string по значению или константной ссылке. Если это не подходит, тогда возьмите const char*, укажите в документации по функции, что null не принят, и сделайте во время выполнения утверждение, что указатель не является нулевым.

4 голосов
/ 17 января 2012

Это не мешает вам получать указатели NULL ... вы получаете ссылку на указатель ... это означает, что значение в адресе памяти (или регистре), представленное аргументом ссылки на машине -код уровня будет адресом указателя, а не самим значением указателя. Таким образом, указателю может быть присвоено значение NULL.

Таким образом, хотя сам аргумент не может быть NULL (как могло бы быть, если аргумент был указателем), значение, на которое указывает указатель, может быть NULL, и поэтому вам все равно придется проверять наличие указателей NULL.

3 голосов
/ 17 января 2012

Вы передаете const-ссылку на строку C, но это будет , а не гарантия cstring сама содержит значение NULL.Вы все еще должны проверить cstring == NULL вручную внутри foo.Это похоже на то, что int const& не будет мешать вам передавать значение 0.

0 голосов
/ 17 января 2012

Ссылка эквивалентна T* const ptr_name.

Во-вторых, я бы сказал, что вы всегда должны проверять нулевые указатели.

...