задаются как второй параметр:
new RegExp('[\\?&]' + name + '=([^&#]*)', "i")
const
-квалификаторы для членов позволяют компилятору предполагать, что - после инициализации объекта - эти члены не должны быть изменены каким-либо образом, и он может оптимизировать код соответствующим образом (см., Например, комментарий @Ajay Brahmakshatriya ).
Таким образом, важно отличать фазу инициализации от последующих фаз, на которых будут применяться назначения , т.е. с какого момента компилятор может предположить, что объект был инициализирован и имеет эффективный тип, на который можно положиться.
Я думаю, что есть главное различие между вашим примером и тем, что вы приняли в принятом ответе. В этом SO-ответе, целевой агрегатный объект с константными типами элементов создается через malloc
:
ImmutablePoint init = { .x = x, .y = y };
ImmutablePoint *p = malloc(sizeof *p);
memcpy(p, &init, sizeof *p);
Согласно правилам того, как хранимое значение объекта может доступ (см. эту часть онлайн-проекта стандарта c ), целевой объект p
впервые получит свой эффективный тип в ходе выполнения memcpy
; эффективный тип - это тип исходного объекта init
, а первый memcpy
объекта, получившего malloced
, можно рассматривать как инициализацию. Однако впоследствии изменение константных членов целевого объекта будет UB (я думаю, что даже секунда memcpy
будет UB, но это, вероятно, основано на мнении).
6.5 Выражения
- Эффективным типом объекта для доступа к его сохраненному значению является объявленный тип объекта, если таковой имеется. 87) ... Если значение копируется в объект, не имеющий объявленного типа, используя memcpy или memmove, или копируется как массив символьного типа, , тогда эффективный тип модифицированного объекта для этот доступ и для последующих обращений, которые не изменяют значение, является эффективным типом объекта, из которого копируется значение , если оно имеется. Для всех других обращений к объекту, у которого нет объявленного типа, эффективным типом объекта является просто тип lvalue, используемого для доступа.
87) Выделенные объекты не имеют объявленного типа.
blockquote>Однако в вашем примере целевой объект
dst
уже имеет объявленный тип в своем определенииstruct vector dst;
. Следовательно, const-квалификаторы на элементахdst
уже существуют до примененияmemcpy
, и его следует рассматривать как назначение, а не инициализацию.Так что я бы проголосовал за UB в этом случае.