我想創建一個從它回傳構造的 rapidjson::Value 的函式。像這樣:
using JsonValue = rapidjson::GenericValue< rapidjson::UTF16LE<> >;
JsonValue MakeInt(int val)
{
return JsonValue().SetInt(val); //copy-by-reference is forbidden
//return JsonValue().SetInt(val).Move(); //same, Move() returns a reference
//return std::move(JsonValue().SetInt(val)); //gcc complains about RVO failure
//JsonValue json_val;
//json_val.SetInt(val);
//return json_val; //copy constructor is forbidden
}
但是,由于評論中列出的各種原因,每次嘗試都失敗了。
顯然我可以通過參考傳遞一個目標值:
void WriteInt(JsonValue &dst_val, int val)
{
dst_val.SetInt(val);
}
但我想知道我應該如何讓它成為一個回傳值。
PS我注意到有幾個類似的問題,比如RapidJSON:Return GenericValue from Function,但沒有一個得到回答。
更新:實際的解決方案應該只是在任何支持 c 11 的編譯器上回傳這樣的值:
JsonValue MakeInt(int val)
{
JsonValue json_val;
json_val.SetInt(val);
return json_val;
}
但是這段代碼無法在 clang 構建中為我們編譯。結果發現原因不是編譯器的差異,而是因為 rapidjson.h 中的移動建構式宣告如下:
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
//! Move constructor in C 11
GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) {
rhs.data_.f.flags = kNullFlag; // give up contents
}
#endif
事實證明,宏 RAPIDJSON_HAS_CXX11_RVALUE_REFS 由于其在 rapidjson.h 中的宣告而被設定為 0:
#if __has_feature(cxx_rvalue_references) && \
(defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306)
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
#else
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
#endif
這反過來又是因為在我們的配置中既沒有宣告 _LIBCPP_VERSION 也沒有宣告 GLIBCXX。這是我們在 clang 上的構建系統錯誤,不知何故最終沒有定義其編譯器宏。
uj5u.com熱心網友回復:
您使用的是什么編譯器和 C 版本?這在 MS Visual Studio 2019 中編譯正常:
using JsonValue = rapidjson::GenericValue< rapidjson::UTF16LE<> >;
JsonValue MakeInt(int val)
{
JsonValue json_val;
json_val.SetInt(val);
return json_val;
}
我用 C 11 編譯。請看這個(來自document.h)
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
//! Move constructor in C 11
GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) {
rhs.data_.f.flags = kNullFlag; // give up contents
}
#endif
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/446382.html
下一篇:使用JQ鍵組合兩個Json
