I have an overloaded function that can take either a std::string or a 
Local<Value>, however, when I pass in a const char *, expecting to have the 
std::string version selected, I instead get an ambiguity error.  I added 
another version that takes a Local<Script> and that was added to the list 
of compatible overloaded functions for my call.

The constructor 
at http://v8.paulfryzel.com/docs/master/include_2v8_8h_source.html line 332:

template <class S>
333  V8_INLINE Local(S* that)
334  : val_(that) {}

336  T* val_;

is what's causing me headaches. 

As far as I can tell, it doesn't matter if T* and S* are convertible, 
because when the compiler is looking for implicit conversions, it doesn't 
care if the compiler could actually succeed, just that the types match up. 

This means that any function that takes a Local<ANYTHING> will be a viable 
implicit conversion overload match for any pointer type. Is this a 
desirable behavior? 


I believe this code shows a way to use SFINAE to stop this from happening: 
http://ideone.com/cvZOHt

basically:

template <class S, typename = std::enable_if_t<std::is_convertible<T*,S*>::
value>>
V8_INLINE Local(S* that)
 : val_(that) {}
V8_INLINE static Local<T> New(Isolate* isolate, T* that);
T* val_;

I believe std::is_convertible is the exact test as to whether : val_(that) 
will create a compilation error, but I don't know for sure.

If this doesn't change any intended behavior, I'd love to see it merged in. 
Thank you.

--Zac

-- 
-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to