The rope template allows for CharT to be defined as a variety of data types from byte-sized to 2-byte or even 4-byte sized. When sizeof(CharT) > 1, many strings could be compacted to save memory.
For example, all ropes containing characters with a value < 0x100 could be compacted so that each character takes only a single byte. This does not mean that each character is converted to UTF-8. It means that the upper bytes are simply thrown away (since they are 0x00 anyway). When the program requires a character, the byte is reinterpret_cast to CharT and the upper bytes are set to 0 again.
Let's say a program has English strings and Japanese strings. The Japanese strings will have characters which require 2-bytes. These strings won't be compacted. The English strings will have characters which require only 1-byte each. These strings will be compacted. Long strings with a single Japanese character might be stored as 3 substrings. 1 compacted substring that comes before the Japanese character. 1 compacted substring that comes after the Japanese character. 1 substring that has the Japanese character.
In a server where rope is defined with a 2-byte CharT, compact strings will save 1/2 of the string data memory. HotSpot JVM did this and saw not only the memory savings but also a performance improvement for applications where performance is memory bandwidth constrained.
Of course, c_str() will force a copy of the rope data to be an array of CharT. If the copy is used as the sole copy of the rope, then it could be reverted back to byte format when delete_c_str() is called.