Попробуйте заменить
.populate('tags').where('tags.tagName').in(['funny', 'politics'])
на
.populate( 'tags', null, { tagName: { $in: ['funny', 'politics'] } } )
Как я уже сказал в своем комментарии, как только вы изменили значение const, вы оказались в стране неопределенного поведения, поэтому нет особого смысла говорить о том, что происходит. Но какого черта...
cout << *w << endl; // (3) outputs 5
cout << e << endl; // (4) outputs 2
Полагаю, *w
оценивается во время выполнения, но e
рассматривается как константа времени компиляции
Я подозреваю, что вы сбиваете с толку компилятор. Он не ожидает, что вы сыграете грязные шутки с e, поэтому, когда он видит строку:
cout << e << endl;
, он просто вставляет значение 2 вместо того, чтобы искать фактическое значение. Вы можете проверить (или опровергнуть) это, посмотрев дизассемблер вашей программы.
Я предполагаю, что компилятор оптимизировал вывод значений. Он видит, что e
является const (поэтому он не может измениться - теоретически) и изменяет cout << e << endl;
на cout << 2 <
e
все еще должен существовать, потому что он используется w
, поэтому w
правильно принимает свой адрес и изменяет его значение, но вы не видите этого в cout
.
Мораль истории - объявляйте вещи const
только тогда, когда вы действительно хотите быть const
. Отбрасывать const
- плохая идея.
Единственное, что я могу придумать, это то, что у компилятора есть некоторые как оптимизировал код таким образом, что любые ссылки на e заменяются значением 2, даже если он выделяет память для e
, поэтому в действительности (влияет?) строка в комментарии (4) «оптимизирована», чтобы быть
cout << "2" << endln;
Я предполагаю, что компилятор использует константу для оптимизации переменной и вставки фиксированного значения в код.