diff -aur Rcpp-old/inst/include/Rcpp/vector/MatrixRow.h Rcpp-new/inst/include/Rcpp/vector/MatrixRow.h
--- Rcpp-old/inst/include/Rcpp/vector/MatrixRow.h	2012-12-11 08:25:19.000000000 +0000
+++ Rcpp-new/inst/include/Rcpp/vector/MatrixRow.h	2013-02-01 10:24:01.788217400 +0000
@@ -47,18 +47,20 @@
             index++;
             return *this ;
         }
-        iterator& operator++(int) { 
+        iterator operator++(int) { 
+            iterator orig(*this);
             index++;
-            return *this ;
+            return orig ;
         }
         
         iterator& operator--(){ 
             index-- ;
             return *this ;
         } 
-        iterator& operator--(int){ 
+        iterator operator--(int){ 
+            iterator orig(*this);
             index-- ;
-            return *this ;
+            return orig ;
         }
                                     
         iterator operator+(difference_type n) const { return iterator( row, index + n ) ; }
diff -aur Rcpp-old/inst/unitTests/cpp/Vector.cpp Rcpp-new/inst/unitTests/cpp/Vector.cpp
--- Rcpp-old/inst/unitTests/cpp/Vector.cpp	2012-12-03 05:48:07.000000000 +0000
+++ Rcpp-new/inst/unitTests/cpp/Vector.cpp	2013-02-01 10:32:12.167217400 +0000
@@ -456,6 +456,31 @@
 }
 
 // [[Rcpp::export]]
+CharacterVector character_matrix_row_iteration_incr( CharacterMatrix m ){
+    std::string pasted_row;
+    CharacterMatrix::Row row(m(1, _));
+    CharacterMatrix::Row::iterator i_row(row.begin());
+    for( size_t i=0 ; i<4; i++){
+        pasted_row += *i_row++;
+    }
+    return wrap( pasted_row ) ;
+}
+
+// [[Rcpp::export]]
+CharacterVector character_matrix_row_iteration_decr( CharacterMatrix m ){
+    std::string pasted_row;
+    CharacterMatrix::Row row(m(1, _));
+    CharacterMatrix::Row::iterator i_row(row.end());
+    i_row--; // Step back from 'one past the end' to 'last element'.
+    // Only copy the last three elements, to avoid creating an invalid
+    // 'one before the beginning' iterator:
+    for( size_t i=0 ; i<3; i++){
+        pasted_row += *i_row--;
+    }
+    return wrap( pasted_row ) ;
+}
+
+// [[Rcpp::export]]
 CharacterVector character_assign1(){
     const char* x[] = { "foo", "bar", "bling", "boom" } ;
     CharacterVector y ;
diff -aur Rcpp-old/inst/unitTests/runit.Vector.R Rcpp-new/inst/unitTests/runit.Vector.R
--- Rcpp-old/inst/unitTests/runit.Vector.R	2012-12-04 01:37:27.000000000 +0000
+++ Rcpp-new/inst/unitTests/runit.Vector.R	2013-02-01 10:39:08.253217400 +0000
@@ -426,6 +426,16 @@
     checkEquals( diag(fun(x)), rep("foo", 4) , msg = "matrix indexing lhs" )
 }
 
+test.CharacterVector.matrix.row.iteration <- function() {
+    x <- matrix(letters[1:16], nrow = 4)
+
+    fun <- character_matrix_row_iteration_incr
+    checkEquals( fun(x), "bfjn", msg = "matrix row iteration post-incr" )
+
+    fun <- character_matrix_row_iteration_decr
+    checkEquals( fun(x), "njf", msg = "matrix row iteration post-decr" )
+}
+
 test.CharacterVector.assign <- function(){
     fun <- character_assign1
     checkEquals( fun(), c("foo", "bar", "bling", "boom"), msg = "assign(char**, char**)" )
