Я учусь связывать объекты C ++ с Lua с помощью проверки типов из книги Программирование Gems 6 (Глава 4.2).Для проверки типа пары userdata / string хранятся в таблице окружения с указанным кодом, как это сделать:
void Binder::pushusertype(void* udata, const char* tname) {
lua_pushlightuserdata(L, udata); // push address
lua_pushvalue(L, -1); // duplicate address
lua_pushstring(L, tname); // push type name
lua_rawset(L, LUA_ENVIRONMENTINDEX); // envtable[address] = tname
}
Где класс Binder имеет Lua State в качестве атрибута с именем "L"
Как видите, адрес нажимается дважды.Поскольку этот небольшой фрагмент кода приведен только в качестве примера, не похоже, чтобы дублированный адрес, помещенный в стек, служил бы какой-либо цели за пределами этой функции, что заставляет меня думать, что для этого есть конкретная причина.Поэтому мой вопрос: зачем это делать?