And now sent a pull request. Not sure this will be merged in with the new commandment that « Thou shalt not break abi ». See: https://github.com/RcppCore/Rcpp/pull/211
Romain > Le 29 nov. 2014 à 13:52, Romain François <rom...@r-enthusiasts.com> a écrit : > > Promoted this to an issue on github. > https://github.com/RcppCore/Rcpp/issues/209 > > Should not be very hard to fix, but this is indeed a bug. The code should not > compile if Rcpp respected const correctness. > >> Le 26 nov. 2014 à 14:20, Martyn Plummer <plumm...@iarc.fr> a écrit : >> >> This is related to David Shih's thread about modifying input arguments >> but I think it needs its own thread. >> >> I found a problem when I tried porting some Rcpp code to run outside of >> Rcpp by providing my own NumericVector implementation based on STL >> vectors. In Rcpp it is possible to obtain a non-constant iterator for a >> constant vector, whereas STL does not allow this. >> >> In particular, it is possible to modify a const NumericVector. The >> compiler allows this because the actual contents of the NumericVector >> are in auxiliary memory. But this breaks the abstraction of the >> NumericVector class. >> >> An example is given below. The "sumsquares" function calculates the sum >> of squares of a vector. Internally, it calls the "workhorse" function, >> which is declared to take a constant reference as an argument. So it >> looks safe to pass the input vector to "workhorse" without copying. >> However the implementation of "workhorse" does in fact alter the vector. >> >> ### BEGIN SS.cc >> #include <Rcpp.h> >> >> using Rcpp::NumericVector; >> >> static double workhorse(NumericVector const &v); >> >> // [[Rcpp::export]] >> double sumsquares(NumericVector v) >> { >> //Since workhorse takes a constant reference we think we do not need >> //to copy v... >> return workhorse(v); >> } >> >> double workhorse(NumericVector const &v) >> { >> double y = 0; >> for (NumericVector::iterator i = v.begin(); i != v.end(); ++i) { >> double &x = *i; >> //... but this function does alter its argument >> x *= x; >> y += x; >> } >> return y; >> } >> ### END SS.cc >> >> In R we have >> >>> library(Rcpp) >>> sourceCpp("SS.cc") >>> x <- c(1,2,3) >>> sumsquares(x) >> [1] 14 >>> x #is modified >> [1] 1 4 9 >> >> Martyn >> >> >> ----------------------------------------------------------------------- >> This message and its attachments are strictly confidential. If you are >> not the intended recipient of this message, please immediately notify >> the sender and delete it. Since its integrity cannot be guaranteed, >> its content cannot involve the sender's responsibility. Any misuse, >> any disclosure or publication of its content, either whole or partial, >> is prohibited, exception made of formally approved use >> ----------------------------------------------------------------------- >> _______________________________________________ >> Rcpp-devel mailing list >> Rcpp-devel@lists.r-forge.r-project.org >> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > > _______________________________________________ > Rcpp-devel mailing list > Rcpp-devel@lists.r-forge.r-project.org > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel