or perhaps the template on the constructor isn't even necessary?   

http://ideone.com/MXwvp9

shows the same behavior.

V8_INLINE Local(T* that)
 : val_(that) {}
V8_INLINE static Local<T> New(Isolate* isolate, T* that);
T* val_;

On Wednesday, January 27, 2016 at 5:16:54 PM UTC-8, [email protected] wrote:
>
> I think I simply had the parameters to is_convertible backwards in my 
> first post:
>
> template <class S, typename = std::enable_if_t<std::is_convertible<S*,T*>
> ::value>>
> V8_INLINE Local(S* that)
>  : val_(that) {}
> V8_INLINE static Local<T> New(Isolate* isolate, T* that);
> T* val_;
>
>
> This link http://ideone.com/RVL4rD shows overloaded functions being 
> selected appropriately as well as pointer assignment working between 
> compatible types.
>
> On Wednesday, January 27, 2016 at 5:03:49 PM UTC-8, [email protected] 
> wrote:
>>
>> is_convertible doesn't seem to be the right test.   I'm trying to figure 
>> out if I can find a better one.
>>
>> On Wednesday, January 27, 2016 at 4:48:56 PM UTC-8, [email protected] 
>> wrote:
>>>
>>> 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