fix
authorycqiu <429148848@qq.com>
Tue, 6 Oct 2015 08:46:19 +0000 (16:46 +0800)
committerChristopher Dunn <cdunn2001@gmail.com>
Sat, 10 Oct 2015 22:17:20 +0000 (17:17 -0500)
In value.h, ValueConstIterator can convert to ValueIterator, I think that is a bug. the correct way is ValueIterator can convert to ValueConstIterator.

include/json/value.h
src/lib_json/json_valueiterator.inl
src/test_lib_json/main.cpp

index 237aa53..7f3ad9b 100644 (file)
@@ -738,6 +738,7 @@ public:
   typedef ValueConstIterator SelfType;
 
   ValueConstIterator();
+  ValueConstIterator(ValueIterator const& other);
 
 private:
 /*! \internal Use by Value to create an iterator.
@@ -787,7 +788,7 @@ public:
   typedef ValueIterator SelfType;
 
   ValueIterator();
-  ValueIterator(const ValueConstIterator& other);
+  explicit ValueIterator(const ValueConstIterator& other);
   ValueIterator(const ValueIterator& other);
 
 private:
index b3bbc35..ec9c851 100644 (file)
@@ -129,6 +129,9 @@ ValueConstIterator::ValueConstIterator(
     const Value::ObjectValues::iterator& current)
     : ValueIteratorBase(current) {}
 
+ValueConstIterator::ValueConstIterator(ValueIterator const& other)
+    : ValueIteratorBase(other) {}
+
 ValueConstIterator& ValueConstIterator::
 operator=(const ValueIteratorBase& other) {
   copy(other);
@@ -149,7 +152,9 @@ ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current)
     : ValueIteratorBase(current) {}
 
 ValueIterator::ValueIterator(const ValueConstIterator& other)
-    : ValueIteratorBase(other) {}
+    : ValueIteratorBase(other) {
+  throwRuntimeError("ConstIterator to Iterator should never be allowed.");
+}
 
 ValueIterator::ValueIterator(const ValueIterator& other)
     : ValueIteratorBase(other) {}
index c6b6721..c1061f4 100644 (file)
@@ -10,7 +10,6 @@
 #include <limits>
 #include <sstream>
 #include <string>
-#include <iostream>
 #include <iomanip>
 
 // Make numeric limits more convenient to talk about.
@@ -2436,7 +2435,9 @@ JSONTEST_FIXTURE(IteratorTest, indexes) {
 
 JSONTEST_FIXTURE(IteratorTest, const) {
   Json::Value const v;
-  Json::Value::iterator it = v.begin(); // This *should not* compile, but does.
+  JSONTEST_ASSERT_THROWS(
+    Json::Value::iterator it(v.begin()) // Compile, but throw.
+  );
 
   Json::Value value;