• Bruce Merry's avatar
    Fix make_key_iterator/make_value_iterator for prvalue iterators (#3348) · 8a7c266d
    Bruce Merry authored
    * Add a test showing a flaw in make_key_iterator/make_value_iterator
    
    If the iterator dereference operator returns a value rather than a
    reference (and that pair also does not *contain* references),
    make_key_iterator and make_value_iterator will return a reference to a
    temporary, causing a segfault.
    
    * Fix make_key_iterator/make_value_iterator for prvalue iterators
    
    If an iterator returns a pair<T1, T2> rather than a reference to a pair
    or a pair of references, make_key_iterator and make_value_iterator would
    return a reference to a temporary, typically leading to a segfault. This
    is because the value category of member access to a prvalue is an
    xvalue, not a prvalue, so decltype produces an rvalue reference type.
    Fix the type calculation to handle this case.
    
    I also removed some decltype parentheses that weren't needed, either
    because the expression isn't one of the special cases for decltype or
    because decltype was only used for SFINAE. Hopefully that makes the code
    a bit more readable.
    
    Closes #3347
    
    * Attempt a workaround for nvcc
    8a7c266d
test_sequences_and_iterators.cpp 19 KB