Here's evidence that it is:
inline
constexpr std::size_t prev(std::size_t i) {
    --i;
    return i;
}
int main() {
    static const std::size_t i = 0;
    static_assert(prev(i) == std::size_t(-1), "Decrementing should give     std::size_t(-1)");    
    return 0;
}
That compiles happily with -std=c++14.
I came upon this because I had a loop indexing over a std::vector and wanted to loop backward, so I changed it to
for (std::size_t i = std::min(idx, v.size() - 1); i != std::size_t(-1); --i) { ... }
Now, I realize I could use std::vector::reverse_iterator, but my real question now is, is the behavior I'm expecting well-defined?
 
     
     
    