То, о чем вы спрашивали в обновленном вопросе (передача ссылки на неконстантный std::string
объект), не будет (или, по крайней мере, не должно) работать.
Абсолютно верно, чтокомпилятор может создать временный строковый объект из строкового литерала. Этот временный объект может быть передан по значению. Вы также можете привязать ссылку на строковый объект const к временному строковому объекту (и, в более общем случае, ссылку на const T для временного T).
Но ссылка на неконстантный тип может 'не может быть привязан к временному объекту, поэтому компилятор будет (или, по крайней мере, должен) отклонить ваш код.
Однако есть одно исключение: старые компиляторы Microsoft did допускают неконстантную ссылкупривязать к временному объекту. Как отметили некоторые из сотрудников Microsoft, это довольно безопасно - это позволяет вам изменять временный объект, который, как правило, довольно бесполезен (объект будет просто уничтожен, когда функция вернется, поэтому ничто другое не сможет / никогда не увидитизменения, как вы обычно ожидаете, происходят при изменении чего-то, передаваемого по неконстантной ссылке. С другой стороны, они утверждают, что, поскольку ничто иное не может увидеть изменения, разрешение их довольно безвредно. Я склонен не соглашаться споследнее, поскольку допущение того, что происходит, что почти наверняка произошло случайно, вредно не из-за того, что происходит в программе впоследствии, а просто потому, что компилятор не предупредил программиста о том, что он сделал что-то, что почти наверняка является ошибкой.
Я не уверен точно, когда Microsoft исправила этот недостаток в своем компиляторе, но последние версии (по крайней мере, начиная с VS 2015 года) отклоняют код так, как должны. Я знаю, что они приняли его когда-то, ноЯ не уверен насчет точной версии, когда она изменилась.
Сводка
Код, который пытается связать неконстантную ссылку с временной, должен быть отклонен, нос компилятором Microsoft это не обязательно будет.