Из этой статьи в блоге Visual C ++ о ссылках rvalue :
... C ++ не хочет, чтобы вы случайно изменяли временные разделы, но напрямую вызывали не- Функция const member на изменяемом rvalue является явной, поэтому разрешено ...
blockquote>В принципе, вы не должны пытаться изменять временные разделы по той причине, что они являются временными объектами и будут умирать момент сейчас. Причина, по которой вам разрешено вызывать неконстантные методы, - это то, что вы можете делать какие-то «глупые» вещи, пока знаете, что делаете, и о них явно (например, используя reinterpret_cast). Но если вы привязываете временную ссылку на неконстантную ссылку, вы можете продолжать ее прокручивать «навсегда» только для того, чтобы ваши манипуляции с объектом исчезли, потому что где-то по пути вы полностью забыли, что это было временным.
Если бы я был вами, я бы переосмыслил дизайн своих функций. Почему g () принимает ссылку, изменяет ли параметр? Если нет, сделайте ссылку на const, если да, то почему вы пытаетесь временно переходить к ней, разве вам не важно, что вы временно изменяете? Почему getx () возвращается в любом случае временно? Если вы поделитесь с нами своим реальным сценарием и тем, что вы пытаетесь выполнить, вы можете получить некоторые полезные советы о том, как это сделать.
Против языка и обмана компилятора редко решает проблемы - обычно он создает проблемы.
Редактировать: адресация вопросов в комментарии: 1)
X& x = getx().ref(); // OK when will x die?
- я не знаю, и мне все равно, потому что это именно то, что я имею в виду под «идеей против языка». Язык говорит, что «временные члены умирают в конце утверждения, если только они не связаны с константой ссылки, и в этом случае они умирают, когда ссылка выходит за рамки». Применяя это правило, кажется, что x уже мертв в начале следующего оператора, так как он не привязан к const reference (компилятор не знает, что возвращает ref ()). Однако это только предположение.2) Я четко сформулировал цель: вам не разрешено изменять временные рамки, потому что это просто не имеет смысла (игнорируя ссылки на C ++ 0x rvalue). Вопрос: «Тогда почему мне позволено называть неконстантных членов?» является хорошим, но у меня нет лучшего ответа, чем тот, который я уже сказал выше.
3) Хорошо, если я прав относительно x в
X& x = getx().ref();
, умирающем в конце утверждения, проблемы очевидны.В любом случае, исходя из вашего вопроса и комментариев, я не думаю, что даже эти дополнительные ответы вас устраивают. Вот окончательная попытка / сводка: комитет C ++ решил, что не имеет смысла изменять временные рамки, поэтому они запрещают привязку к неконстантным ссылкам. Может быть, некоторые реализации компилятора или исторические проблемы также были задействованы, я не знаю. Затем возник какой-то конкретный случай, и было решено, что, несмотря ни на что, они по-прежнему позволят прямое изменение путем вызова метода non-const. Но это исключение - вам обычно не разрешается изменять временные рамки. Да, C ++ часто бывает странным.
После пребывания в течение слишком многих часов, исследуя, и реализовывая вышеупомянутый ответ, я нашел свою ошибку для этой проблемы! Я добавил этот ответ, чтобы быть дополнительным принятого ответа. Я настроил все, как упомянуто, но глюк для меня был на самом деле в самом браузере!
При тестировании локально, удостоверьтесь, что Вы получаете доступ, реагируют до 127.0.0.1
вместо localhost
! localhost
дескрипторы запрашивают заголовки по-другому, и не показывает маркеры CSRF в ответе заголовка, где как 127.0.0.1
будет! Таким образом вместо localhost:3000
попытка 127.0.0.1:3000
!
Hope это помогает.