> On Dec 14, 2018, at 3:52 PM, Chris Dumez <cdu...@apple.com 
> <mailto:cdu...@apple.com>> wrote:
> 
> So to be clear, it is often not truly about using the value after it is 
> moved. It is about expecting that the variable / member has been nulled out 
> after moving it.
> If I WTFMove() out a data member m_dataMember, I expect later on `if 
> (m_dataMember)` to be false.
> 

I do not mean to derail the discussion about whether or not we should have our 
own std::optional that disengages on move. I am all for convenience. I think 
expecting a valid “empty” state (*) when moving out a data member is an 
anti-pattern and I propose that we should be using std::exchange() instead (or 
any code analogous to doing std::exchange()) for these cases, including the 
case in your original email and especially with data members as in 
<https://trac.webkit.org/changeset/239228 
<https://trac.webkit.org/changeset/239228>>.

Why do I consider it an anti-pattern? See (*) and because the concept of 
“moving" is not spec'ed to behave like this. Here’s one reference to the 
spec’ed behavior and an example comparable to the one in your first email 
(highlighting is my own for emphasis):

[[
Unless otherwise specified, all standard library objects that have been moved 
from are placed in a valid but unspecified state. That is, only the functions 
without preconditions, such as the assignment operator, can be safely used on 
the object after it was moved from:
std::vector <http://en.cppreference.com/w/cpp/container/vector><std::string 
<http://en.cppreference.com/w/cpp/string/basic_string>> v;
std::string <http://en.cppreference.com/w/cpp/string/basic_string> str = 
"example";
v.push_back(std::move(str)); // str is now valid but unspecified
str.back(); // undefined behavior if size() == 0: back() has a precondition 
!empty()
str.clear(); // OK, clear() has no preconditions

]]
<https://en.cppreference.com/w/cpp/utility/move 
<https://en.cppreference.com/w/cpp/utility/move>>

(*) What is the valid “empty” state for a type without a default constructor?

Dan

> --
>  Chris Dumez
> 
> 
> 
> 
>> On Dec 14, 2018, at 3:45 PM, Chris Dumez <cdu...@apple.com 
>> <mailto:cdu...@apple.com>> wrote:
>> 
>> 
>>> On Dec 14, 2018, at 3:39 PM, Fujii Hironori <fujii.hiron...@gmail.com 
>>> <mailto:fujii.hiron...@gmail.com>> wrote:
>>> 
>>> 
>>> On Sat, Dec 15, 2018 at 6:38 AM Chris Dumez <cdu...@apple.com 
>>> <mailto:cdu...@apple.com>> wrote:
>>> 
>>> I have now been caught twice by std::optional’s move constructor. 
>>> 
>>>  I don't understand how this could be useful? Do you want to use the value 
>>> after it is moved? I'd like to see these your code. Could you show me these 
>>> two patches?
>> 
>> This is the latest one: https://trac.webkit.org/changeset/239228/webkit 
>> <https://trac.webkit.org/changeset/239228/webkit>
>> 
>> 
>> _______________________________________________
>> webkit-dev mailing list
>> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>
>> https://lists.webkit.org/mailman/listinfo/webkit-dev 
>> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
> 
> _______________________________________________
> webkit-dev mailing list
> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>
> https://lists.webkit.org/mailman/listinfo/webkit-dev 
> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to