Instead of passing by const-reference and then making your own copies, just pass by value. That way, you make the copies that you need anyway, and you don't have to come up with separate names for the parameters and the copies.
'bit == start' can't ever happen in your for-loop, unless 'BitName()' does some kind of looping logic. I was assuming BitName is just an enumeration, though, such that this is just a cast.
Consider overloading operator++ for BitName. That way you can make it do the looping logic if necessary, too.
Oh, and you can append a single char to a std::string with operator+ and it does what you want; no need to mess around creating a string. (You can append a null-terminated char*, too.) (And what's in m_binary that you have to cast the result to char? If it's a vector of char, then no cast is needed; if it's a vector of bool, then the cast will give you 0 and 1 bytes rather than '0' and '1' symbols.)
// I prefer 'asBinary' as a name because it implies an alternate representation// for the data, rather than simple access.std::string KlOctet::asBinary(BitName start, BitName stop) const { if (start > stop) { std::swap(start, stop); } std::string binaryString; for (BitName bit = start; bit <= stop || bit == start; ++bit) { binaryString += char(m_binary.at(bit)); } return binaryString;}