5

-std=c++0x を使用してコンパイルした場合と使用しない場合でコンパイルした Rcpp の間に奇妙な矛盾があることがわかりました。

表現を考える

Function data_frame("data.frame");

GenericVector a;
a.push_back("17");

return data_frame(a, _["stringsAsFactors"]=0);

(編集注: Rcpp の DataFrame への強制は、実際には R 関数にサンクダウンしますが、ユーザーがそのフラグを設定することはできません。)

「古い」C++ (-std=c++0x が設定されていない) では、このコードは機能します。最新の C++ (w/ -std=c++0x セット) では、これは失敗し、「クラス "pairlist" を data.frame に強制できません」と表示されます。

明らかに、これは世界の終わりではありません。新しい機能を使用していないだけです。しかし、この違いの原因と、C++11 を捨てずに回避する方法について、私は完全に途方に暮れていることを告白します。アイデアはありますか?

4

2 に答える 2

5

新しい標準のコード ターゲット機能は、Rcpp約 2 年前に作成されました。

しかし、その後、 gcc のフラグ (または他のコンパイラの同等のフラグ) をCRAN受け入れず、C++99 標準を強制しているため、現実的には使用できないことに後で気付きました。-std=c++0x

C++11その結果、認識しているコードを維持することはほとんどありません。本当はそうしたいと思っているので残念ですが、CRAN で受け入れられることを公開したいと考えています。メンテナンスをしていないので、思うように動かないことも多々あると思います。

この特定の問題は、おそらく簡単に修正できます。これは、 の使用に青信号が表示されるとすぐに発生しC++11ます。

于 2012-11-14T21:52:21.227 に答える
4

私たちはC++11が大好きで、それを使うのが待ちきれません。ただし、CRANへのアップロードには使用できません(現時点でC ++ 11を「移植性がない」と見なしているCRANメンテナの法令に従い、私たちではなく、彼らに不満を言ってください)。

その結果、現在「禁止」されています。には少し検出がRcppCommon.hあり、を定義しますHAS_CXX0X。しかし、前の段落では(まだ)できないため、このためのコードは実際には作成していません。

したがって、バグを見つけた場合は、私たちにお願いし、フォローアップを送信するリクエストの場所であるrcpp-develリストを報告してください。再現性は良好で、パッチはさらに優れています:)

于 2012-11-14T20:26:17.297 に答える