Изменение const через неконстантный указатель

Попробуйте заменить

.populate('tags').where('tags.tagName').in(['funny', 'politics']) 

на

.populate( 'tags', null, { tagName: { $in: ['funny', 'politics'] } } )
13
задан jasonline 18 September 2010 в 18:17
поделиться

5 ответов

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

cout << *w << endl;            // (3) outputs 5
cout << e << endl;             // (4) outputs 2

Полагаю, *w оценивается во время выполнения, но e рассматривается как константа времени компиляции

.
17
ответ дан 1 December 2019 в 19:30
поделиться

Я подозреваю, что вы сбиваете с толку компилятор. Он не ожидает, что вы сыграете грязные шутки с e, поэтому, когда он видит строку:

cout << e << endl;

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

8
ответ дан 1 December 2019 в 19:30
поделиться

Я предполагаю, что компилятор оптимизировал вывод значений. Он видит, что e является const (поэтому он не может измениться - теоретически) и изменяет cout << e << endl; на cout << 2 < . Однако e все еще должен существовать, потому что он используется w , поэтому w правильно принимает свой адрес и изменяет его значение, но вы не видите этого в cout .

Мораль истории - объявляйте вещи const только тогда, когда вы действительно хотите быть const . Отбрасывать const - плохая идея.

4
ответ дан 1 December 2019 в 19:30
поделиться

Единственное, что я могу придумать, это то, что у компилятора есть некоторые как оптимизировал код таким образом, что любые ссылки на e заменяются значением 2, даже если он выделяет память для e

, поэтому в действительности (влияет?) строка в комментарии (4) «оптимизирована», чтобы быть

cout << "2" << endln;
3
ответ дан 1 December 2019 в 19:30
поделиться

Я предполагаю, что компилятор использует константу для оптимизации переменной и вставки фиксированного значения в код.

2
ответ дан 1 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

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