Возврат ссылки на данные, хранящиеся в boost :: any - PullRequest
5 голосов
/ 16 марта 2011

У меня есть карта любых указателей, называемая gmap, определенная примерно так:

std::map<std::string, boost::any*>& gmap = getSingleton().globalValues;

Эта карта действительно является ссылкой на globalValues, я проверил адреса в gdb.У меня также есть контроль над любыми указателями (именно поэтому они являются указателями, я бы предпочел ссылки, но я сейчас отлаживаю).Теперь, тогда я возвращаю это тем же способом, который я объявляю gmap:

return boost::any_cast<T&>(*gmap[key]);

Просмотр памяти в & boost :: any_cast [T &] [* gmap [key]], данные испорчены, как только я выскочилэтот кадр стека.Что странно, потому что согласно:

документация Boost по any_cast

Возвращает : если передан указатель, он возвращает аналогично уточненный указатель назначение value в случае успеха, в противном случае возвращается значение null.Если T является ValueType, он возвращает копию удерживаемого значения, в противном случае , если T является ссылкой (возможно, с константным значением) на ValueType, он возвращает ссылку на удерживаемое значение.

Так что, насколько я понимаю, это не должно возвращать ссылку на локальную переменную.

1 Ответ

4 голосов
/ 16 марта 2011

Это странно, но я понял это.

Игнорируя тот факт, что он говорит, что если T является ссылкой, он вернет ее;Я передал ему указатель и получил правильный указатель.Но по какой-то причине я не могу просто разыменовать возвращаемое значение и возврат.Сначала я должен был сохранить этот указатель в явном локальном (в противоположность неявном), разыменовать его и вернуть.

return *boost::any_cast<T>(&gmap[key]);

Приводит к некорректному поведению

T* ret = boost::any_cast<T>(&gmap[key]);
return *ret;

Приводит к правильному поведению.

Не знаю почему, потому что AFAIK локальный объявлен только явно в нижнем примере.Кроме того, gmap теперь представляет собой:

map<std::string, boost::any>

, потому что мне сейчас не нужно владеть какими-либо объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...