C++11 class similar to .Net's ManualResetEvent, but without the ability to "reset"
Looks good.

The only thing I would change is:

volatile bool _state;


into

 std::atomic&lt;bool&gt;  _state;


The issue with volatile is that it does not universally provide that guarantee that updates are visible to all threads (which std::atomic does).

Could simplify the wait() call.

    while (!_state) {
        _underlying.wait(lock);
    }

    // could be:
    _underlying.wait(lock,[&amp;state](){return state;});


Personally I don't like prefix '_' on identifiers. The rules for using '_' as a prefix are complicated. Even if you know the rules not everybody that reads your code will.