У меня следующий код:
#include <string>
#include <cstdio>
std::string name = "Ternary Return Test";
std::string *pname = &name;
const std::string &getName ()
{
return pname ? *pname : "(unnamed)";
}
int main (int argc, char *argv[])
{
const std::string &str = getName();
printf ("Name is \"%s\"\n",str.c_str());
printf ("pName is \"%s\"\n",pname->c_str());
return 0;
}
Функция getName () разыменовывает указатель pname и возвращает его значение в качестве ссылки. Как я понимаю, возвращение ссылки на что-либо через разыменование указателя вполне допустимо. Чтобы избежать разыменования указателя NULL, функция возвращает строку «без имени», в случае (в этом случае невозможном), когда указатель pname имеет значение NULL.
Однако троичный оператор прерывает функцию. Код компилируется, но печатает следующее:
Name is "�
@"
pName is "Ternary Return Test"
Значение, полученное с помощью функции, не работает. Я не могу понять почему. В другой ситуации подобный код вызывает ошибку сегментации. Итак, здесь происходит неопределенное поведение?
Да, в случае, когда pname будет иметь значение NULL, оно вернет ссылку на временный объект, который не определен. Но это не так - я возвращаю ссылку на невременное значение, которое должно быть совершенно корректным.
Как я прочитал, троичный оператор преобразует третье выражение "(без имени)" в тип второй (std :: string). Но в моем случае третье выражение даже не используется.