fix
In value.h, ValueConstIterator can convert to ValueIterator, I think that is a bug. the correct way is ValueIterator can convert to ValueConstIterator.
diff --git a/include/json/value.h b/include/json/value.h
index 237aa53..7f3ad9b 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -738,6 +738,7 @@
typedef ValueConstIterator SelfType;
ValueConstIterator();
+ ValueConstIterator(ValueIterator const& other);
private:
/*! \internal Use by Value to create an iterator.
@@ -787,7 +788,7 @@
typedef ValueIterator SelfType;
ValueIterator();
- ValueIterator(const ValueConstIterator& other);
+ explicit ValueIterator(const ValueConstIterator& other);
ValueIterator(const ValueIterator& other);
private:
diff --git a/src/lib_json/json_valueiterator.inl b/src/lib_json/json_valueiterator.inl
index b3bbc35..ec9c851 100644
--- a/src/lib_json/json_valueiterator.inl
+++ b/src/lib_json/json_valueiterator.inl
@@ -129,6 +129,9 @@
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 @@
: 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) {}
diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp
index c6b6721..c1061f4 100644
--- a/src/test_lib_json/main.cpp
+++ b/src/test_lib_json/main.cpp
@@ -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, 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;