Я хочу, чтобы мой класс провел v8::Context
и v8::External
как участники. Поэтому я подумал, что должен использовать постоянные ручки.
class ScriptHelper {
public:
ScriptHelper(v8::Persistent<v8::Context> Context) : context(Context) {
// ...
}
// ...
private:
v8::Persistent<v8::Context> context;
v8::Persistent<v8::External> external;
};
Однако постоянные дескрипторы не копируются в V8, поэтому код не компилируется. Ошибка возникает в линиях, где две мембраны инициализируются. Для контекста это находится в списке инициализатора конструктора, для внешнего это внутри тела конструктора.
1> ошибка C2440: ‘=’: невозможно преобразовать из ‘v8 :: Primitive *’ в ‘v8 :: Object * volatile’
1> Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, приведения в стиле C или в стиле функции
1> include \ v8 \ v8.h (603): см. Ссылку на компилируемую реализацию шаблона функции ‘void v8 :: NonCopyablePersistentTraits :: Uncompilable (void)’
Я думал об использовании указателей на постоянные дескрипторы, но это кажется нелогичным, поскольку концепция дескрипторов уже подразумевает какую-то ссылку. Более того, я думаю, что ручки будут разрушены, так что внутренний сборщик мусора в V8 сможет очистить объекты.
Как я могу хранить объекты V8 как постоянные члены класса?
Обновление: даже если я использую указатель на постоянные дескрипторы, я получаю те же ошибки компилятора для методов, которые возвращают постоянные дескрипторы.
По умолчанию постоянные дескрипторы используют не копируемую черту. Явная передача копируемой черты в качестве аргумента шаблона заставляет их работать как в предыдущих версиях.
Persistent<Value, CopyablePersistentTraits<Value>> persistent(isolate, value);
Других решений пока нет …