Мы знаем, что в Rcpp следует избегать вызова Rf_error()
, поскольку он включает в себя longjmp над деструкторами С++ в стеке. Вот почему мы скорее бросаем исключения С++ в код Rcpp (например, throw Rcpp::exception("...")
или через функцию stop("...")
).
Однако предупреждения R также могут привести к вызову Rf_error()
(это зависит от опции warn
). Таким образом, вызов Rf_warning()
также опасен.
Rcpp::sourceCpp(code = '
#include <Rcpp.h>
using namespace Rcpp;
class Test {
public:
Test() { Rcout << "start\\n"; }
~Test() { Rcout << "end\\n"; }
};
// [[Rcpp::export]]
void test() {
Test t;
Rf_warning("test");
}
')
options(warn=10)
test()
## start
## Error in test() : (converted from warning) test
Мы видим, что деструктор не был вызван (нет сообщения "end" ).
Как создать предупреждение R на С++ - деструктор-дружественный способ?