Использование const void [duplicate]

Я знаю, что это и старая тема, но вот мое очень простое решение:

  string s = Regex.Escape («pattern - escaped for sanity»). Заменить («%»)  , ". *"). Заменить ("_", ".?");  user = & gt;  Regex.IsMatch (user.FullName, s, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);   

В этом коде я использую общие escape-символы для языка SQL. Если вы хотите использовать say * и ? , escaped string будет содержать \ * и \? соответственно, make обязательно включите символ обратного слэша в операторе .Replace (...) . Конечно, если вы хотите дать своему пользователю возможность искать RexEx, просто не избегайте строки шаблона.

Поиск в учебнике Regex для других опций.

Я считаю, что обычно % будет соответствовать хотя бы одному символу , а RegEx . * будет соответствовать ноль или более символов . Таким образом, в действительности подстановочный символ % больше похож на . + (жадный), а не . * (ленивый).

Надеюсь, это поможет.

58
задан fredoverflow 20 February 2011 в 16:34
поделиться

2 ответа

Не совсем. Но игнорировать cv -qualifications на void или делать их ошибки могли бы создать ненужную сложность с точки зрения как реализации компилятора, так и кода конечного пользователя. Рассмотрим шаблоны типа

  template & lt; typename T & gt;  const ... ...  

Нет причин использовать с помощью void в этом сценарии особый случай (больше, чем он есть), он просто создаст головные боли.

Кроме того, в то время как const void не помогает, const void * имеет свои применения.

44
ответ дан Logan Capaldo 15 August 2018 в 16:22
поделиться
  • 1
    Насколько полезен const void *? Я вижу, как может быть void * const, но не первый. – Spidey 20 March 2012 в 14:56
  • 2
    Вы можете использовать его для сохранения (предполагаемой) константы при круглом отключении через void * land. string read_name (enum dynamic_type, const void *) . Это не супер полезно, нет, но больше, чем const void . И, конечно, void * const полезна, но на самом деле это не вопрос. – Logan Capaldo 20 March 2012 в 16:01
  • 3
    @Spidey Если вы уже делаете такие вещи, как hacking pointers (некоторые T * ) в void * (и обратно позже), тогда const void * является эквивалентом const (поэтому для некоторого const T * ). Конечно, вы могли бы const_cast , но почему? Другими словами, он столь же полезен, как и любой другой const T * , и это «довольно много». :) – Lightness Races in Orbit 9 August 2018 в 15:43

const void разрешен просто потому, что нет смысла заставить компилятор выгнать это одно исключение из общего правила, и ему не вредно оставить его.

Там есть некоторое обсуждение выше, что const void * не очень полезно:

Насколько полезен const void *? Я вижу, как может быть void * const, но не первый. -Spidey

На самом деле const void * иногда является существенным. Он заявляет, что указываемая вещь читается только в отличие от void * const , которая только объявляет, что сам указатель является постоянным, но не тем, на что он указывает.

Из моего опыт, указатель на константу с использованием const void * является более полезным из двух форм. Конечно, существует также const void * const , что означает, что и указатель, и то, что он указывает, являются постоянными.

void * обычно используется как способ передачи неспецифических указателей (например, с помощью memcpy () ). Если вы хотите передать const char * в такую ​​функцию, вы не сможете использовать void * или потеряете тот факт, что предмет, на который он указывает, является постоянным и не может быть изменен , Текущие компиляторы C ++ откажутся от компиляции, так как это должно было бы неявно отбросить const и по праву, так как эти данные могут находиться в постоянной памяти и, возможно, вызывать исключение, если что-либо пытается написать это.

Вот почему второй аргумент memcpy () - const void * , а не просто void * .

11
ответ дан Ben N 15 August 2018 в 16:22
поделиться
  • 1
    Подсказка: замените одинарные кавычки обратными окнами. – Karoly Horvath 22 November 2014 в 11:33
Другие вопросы по тегам:

Похожие вопросы: