https://github.com/open-source-parsers/jsoncpp/issues/47
diff --git a/include/json/value.h b/include/json/value.h
index 197a856..3473c7e 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -240,8 +240,6 @@
 
   Value& operator=(Value other);
   /// Swap values.
-  /// \note Currently, comments are intentionally not swapped, for
-  /// both logic and efficiency.
   void swap(Value& other);
 
   ValueType type() const;
@@ -444,6 +442,9 @@
 
   Value& resolveReference(const char* key, bool isStatic);
 
+  /// Swap values but leave comments and source offsets in place.
+  void swapPayload(Value& other);
+
 #ifdef JSON_VALUE_USE_INTERNAL_MAP
   inline bool isItemAvailable() const { return itemIsUsed_ == 0; }
 
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index b73deac..85b26ce 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -406,11 +406,11 @@
 }
 
 Value& Value::operator=(Value other) {
-  swap(other);
+  swapPayload(other);
   return *this;
 }
 
-void Value::swap(Value& other) {
+void Value::swapPayload(Value& other) {
   ValueType temp = type_;
   type_ = other.type_;
   other.type_ = temp;
@@ -418,6 +418,11 @@
   int temp2 = allocated_;
   allocated_ = other.allocated_;
   other.allocated_ = temp2;
+}
+
+void Value::swap(Value& other) {
+  swapPayload(other);
+  std::swap(comments_, other.comments_);
   std::swap(start_, other.start_);
   std::swap(limit_, other.limit_);
 }