Необходимо предоставить полный путь файлу:
git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
Это пример, когда происходит нежелательное неявное преобразование. ""
не является std :: string
, поэтому компилятор пытается найти способ превратить его в единицу. И с помощью конструктора string (const char * str)
эта попытка преуспевает.
Теперь создан временный экземпляр std :: string
, который будет удален в конце вызова метода. Таким образом, очевидно, не стоит ссылаться на экземпляр, который больше не будет существовать после вызова метода.
Я бы посоветовал вам либо изменить тип возвращаемого значения на const string
, либо сохранить ""
в члене или статической переменной SomeClass
.
Это пример попытки оптимизации кода на C ++. Я сделал это, все сделали это ... Стоит отметить, что это классический пример, который может возвращать оптимизацию значений.
Как и сказал ttvd, правильный ответ - вернуть const std :: string, а не ссылку на него, и позволить компилятору оптимизировать его.
1225] Если вы доверяете интерпретатору вашего любимого языка в оптимизации позади вас, вам также не следует слишком умничать с C ++.
Проблема в первой строке. ""
будет преобразовано в std :: string
, поскольку у него есть допустимый конструктор, который принимает char *
. Этот std :: string
будет анонимным объектом, который является временным, и вы вернете его ссылку.
Как сказал Шегги Лягушонок, он преобразует "" во временный объект std :: string и, поскольку сигнатура вашего метода - std :: string, он пытается вернуть ссылку на него, следовательно, вы получаете предупреждение. Одним из обходных путей может быть возврат std :: string по значению (const std :: string SomeClass :: Foo (..)).