diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h
index 25cbad7bf38713b568dc3b0f46be3f3e838fa185..e4a6a725f8d8d953d072782072e6e808a0144889 100644
--- a/include/flatbuffers/flatbuffers.h
+++ b/include/flatbuffers/flatbuffers.h
@@ -273,6 +273,8 @@ public:
     return IndirectHelper<T>::Read(Data(), i);
   }
 
+  return_type operator[](uoffset_t i) const { return Get(i); }
+
   // If this is a Vector of enums, T will be its storage type, not the enum
   // type. This function makes it convenient to retrieve value with enum
   // type E.
@@ -293,7 +295,7 @@ public:
   // Change elements if you have a non-const pointer to this object.
   void Mutate(uoffset_t i, T val) {
     assert(i < size());
-    WriteScalar(Data() + i * sizeof(T), val);
+    WriteScalar(data() + i, val);
   }
 
   // The raw data in little endian format. Use with care.
@@ -305,6 +307,10 @@ public:
     return reinterpret_cast<uint8_t *>(&length_ + 1);
   }
 
+  // Similarly, but typed, much like std::vector::data
+  const T *data() const { return reinterpret_cast<const T *>(Data()); }
+  T *data() { return reinterpret_cast<T *>(Data()); }
+
   template<typename K> return_type LookupByKey(K key) const {
     void *search_result = std::bsearch(&key, Data(), size(),
         IndirectHelper<T>::element_stride, KeyCompare<K>);
@@ -345,6 +351,7 @@ template<typename T> static inline size_t VectorLength(const Vector<T> *v) {
 
 struct String : public Vector<char> {
   const char *c_str() const { return reinterpret_cast<const char *>(Data()); }
+  std::string str() const { return c_str(); }
 
   bool operator <(const String &o) const {
     return strcmp(c_str(), o.c_str()) < 0;
@@ -509,6 +516,10 @@ class FlatBufferBuilder FLATBUFFERS_FINAL_CLASS {
 
   // Get the released pointer to the serialized buffer.
   // Don't attempt to use this FlatBufferBuilder afterwards!
+  // The unique_ptr returned has a special allocator that knows how to
+  // deallocate this pointer (since it points to the middle of an allocation).
+  // Thus, do not mix this pointer with other unique_ptr's, or call release() /
+  // reset() on it.
   unique_ptr_t ReleaseBufferPointer() { return buf_.release(); }
 
   void ForceDefaults(bool fd) { force_defaults_ = fd; }
diff --git a/include/flatbuffers/reflection.h b/include/flatbuffers/reflection.h
index 475257a31015e32deb116406ef73127184f3d4d6..b97a43320438bde3df47034b70de9e8ebcb772d5 100644
--- a/include/flatbuffers/reflection.h
+++ b/include/flatbuffers/reflection.h
@@ -313,7 +313,7 @@ class ResizeContext {
           auto enumdef = schema_.enums()->Get(fielddef->type()->index());
           // TODO: this is clumsy and slow, but no other way to find it?
           auto type_field = fielddefs->LookupByKey(
-                    (fielddef->name()->c_str() + std::string("_type")).c_str());
+                    (fielddef->name()->str() + "_type").c_str());
           assert(type_field);
           auto union_type = GetFieldI<uint8_t>(table, type_field);
           auto enumval = enumdef->values()->LookupByKey(union_type);
diff --git a/samples/sample_binary.cpp b/samples/sample_binary.cpp
index 7c15b9d3ccec4130bb5c9faf62ac602962566d55..3b6d0fbe4476b14cd47dc0b0dab1d015778fae44 100755
--- a/samples/sample_binary.cpp
+++ b/samples/sample_binary.cpp
@@ -49,7 +49,7 @@ int main(int /*argc*/, const char * /*argv*/[]) {
 
   assert(monster->hp() == 80);
   assert(monster->mana() == 150);  // default
-  assert(!strcmp(monster->name()->c_str(), "MyMonster"));
+  assert(monster->name()->str() == "MyMonster");
 
   auto pos = monster->pos();
   assert(pos);
diff --git a/src/idl_gen_text.cpp b/src/idl_gen_text.cpp
index 138f7320a527f54b67906c6af74086dfe77e17fc..e26d93ca52c1d8db9e4819047d21af17313f5472 100644
--- a/src/idl_gen_text.cpp
+++ b/src/idl_gen_text.cpp
@@ -80,7 +80,7 @@ template<typename T> void PrintVector(const Vector<T> &v, Type type,
       Print(v.GetStructFromOffset(i * type.struct_def->bytesize), type,
             indent + Indent(opts), nullptr, opts, _text);
     else
-      Print(v.Get(i), type, indent + Indent(opts), nullptr,
+      Print(v[i], type, indent + Indent(opts), nullptr,
             opts, _text);
   }
   text += NewLine(opts);
@@ -92,7 +92,7 @@ static void EscapeString(const String &s, std::string *_text) {
   std::string &text = *_text;
   text += "\"";
   for (uoffset_t i = 0; i < s.size(); i++) {
-    char c = s.Get(i);
+    char c = s[i];
     switch (c) {
       case '\n': text += "\\n"; break;
       case '\t': text += "\\t"; break;