clang++ libc++ 用右值初始化 vector<JSONValue *>
clang++ libc++ initialization of vector<JSONValue *> with rvalue
我正在将旧项目更新到最新的 android 构建系统。 Android Studio 3.1.2 和 clang/libc++。该项目使用 https://github.com/MJPA/SimpleJSON 并且无法像使用 gcc 那样进行编译。
我不知道 vector 在 libc++ 中是如何实现的,但似乎默认构造函数试图用 NULL 或其他东西实例化 JSONValue * 而这失败了?
有没有可能我没有在编译中启用正确的定义? include/memory 中的模板专业化位于一个块中,该块仅在 _LIBCPP_CXX03_LANG 未定义时定义。我检查过,这是源代码中唯一检查该定义的地方。我正在使用 -std=c++11 进行编译,那会包含 CXX03 功能吗?:
class JSONValue;
typedef std::vector<JSONValue *> JSONArray;
class JSONValue
{
friend class JSON;
public:
JSONValue(/*NULL*/);
JSONValue(const TCHAR *m_char_value);
JSONValue(const tstring &m_string_value);
JSONValue(bool m_bool_value);
JSONValue(double m_number_value);
JSONValue(const JSONArray &m_array_value);
JSONValue(const JSONObject &m_object_value);
~JSONValue();
JSONValue *Clone() const;
bool IsNull() const;
bool IsString() const;
bool IsBool() const;
bool IsNumber() const;
bool IsArray() const;
bool IsObject() const;
// change the internal type of the JSONValue so that we can keep the contained objects around for
// another instance to clean up. be VERY careful about using this unless you know how to clean up
// memory in a map of pointers on your own. This is major hack territory but it was the fastest
// way to fix a double free without completely changing the printer discovery call chain.
void Detach(void) { type = JSONType_Null; };
const tstring &AsString() const;
bool AsBool() const;
double AsNumber() const;
const JSONArray &AsArray() const;
const JSONObject &AsObject() const;
tstring Stringify() const;
JSONValue* CopyObjectField(const TCHAR *fieldname);
protected:
static JSONValue *Parse(const TCHAR **data);
private:
static tstring StringifyString(const tstring &str);
JSONValue *CloneSimpleValue(const JSONValue *);
JSONValue *RecursiveCloneObject(const JSONObject &inobj) const;
JSONValue *RecursiveCloneArray(const JSONArray &inarray) const;
JSONType type;
tstring string_value;
bool bool_value;
double number_value;
JSONArray array_value;
JSONObject object_value;
};
JSONValue array;
JSONValue 对象的实例化在编译期间导致以下失败:
FAILED: C:\Users\kmurphy\AppData\Local\Android\sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android --gcc-toolchain=C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64 --sysroot=C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sysroot -ID:/SPTX/Include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/android/support/include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++abi/include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sysroot/usr/include/x86_64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -std=c++11 -frtti -fexceptions -x c++ -O0 -fno-limit-debug-info -fPIC -MD -MT D:/SPTX/Builds/Android/tlibJSON/x86_64/CMakeFiles/tlibJSON.dir/JSONValue.cpp.o -MF D:\SPTX\Builds\Android\tlibJSON\x86_64\CMakeFiles\tlibJSON.dir\JSONValue.cpp.o.d -o D:/SPTX/Builds/Android/tlibJSON/x86_64/CMakeFiles/tlibJSON.dir/JSONValue.cpp.o -c D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp
In file included from D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:25:
In file included from D:\SPTX\Projects\Parsers\tlibJSON/stdafx.h:6:
In file included from D:/SPTX/Include/tlibTYPES_android.h:16:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string:470:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string_view:169:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\__string:56:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\algorithm:643:
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2050:9: error: cannot initialize a member subobject of type 'JSONValue **' with an rvalue of type 'long'
: __value_(_VSTD::forward<_Up>(__u)){};
^ ~~~~~~~~~~~~~~~~~~~~~~~~
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2135:9: note: in instantiation of function template specialization 'std::__ndk1::__compressed_pair_elem<JSONValue **, 0, false>::__compressed_pair_elem<long, void>' requested here
: _Base1(std::forward<_Tp>(__t)), _Base2() {}
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:423:7: note: in instantiation of function template specialization 'std::__ndk1::__compressed_pair<JSONValue **, std::__ndk1::allocator<JSONValue *> >::__compressed_pair<long, true>' requested here
__end_cap_(nullptr)
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:473:5: note: in instantiation of member function 'std::__ndk1::__vector_base<JSONValue *, std::__ndk1::allocator<JSONValue *> >::__vector_base' requested here
vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
^
D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:228:13: note: in instantiation of member function 'std::__ndk1::vector<JSONValue *, std::__ndk1::allocator<JSONValue *> >::vector' requested here
JSONArray array;
^
In file included from D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:25:
In file included from D:\SPTX\Projects\Parsers\tlibJSON/stdafx.h:6:
In file included from D:/SPTX/Include/tlibTYPES_android.h:16:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string:470:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string_view:169:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\__string:56:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\algorithm:643:
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2145:9: error: no matching constructor for initialization of '__compressed_pair_elem<JSONValue **, 0>'
: _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {}
^ ~~~~~~~~~~~~~~~~~~~~~~~
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\__split_buffer:309:7: note: in instantiation of function template specialization 'std::__ndk1::__compressed_pair<JSONValue **, std::__ndk1::allocator<JSONValue *> &>::__compressed_pair<long, std::__ndk1::allocator<JSONValue *> &>' requested here
: __end_cap_(nullptr, __a)
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:1567:49: note: in instantiation of member function 'std::__ndk1::__split_buffer<JSONValue *, std::__ndk1::allocator<JSONValue *> &>::__split_buffer' requested here
__split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:1588:9: note: in instantiation of function template specialization 'std::__ndk1::vector<JSONValue *, std::__ndk1::allocator<JSONValue *> >::__push_back_slow_path<JSONValue *const &>' requested here
__push_back_slow_path(__x);
^
D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:256:10: note: in instantiation of member function 'std::__ndk1::vector<JSONValue *, std::__ndk1::allocator<JSONValue *> >::push_back' requested here
array.push_back(value);
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2037:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'long' to 'const std::__ndk1::__compressed_pair_elem<JSONValue **, 0, false>' for 1st argument
struct __compressed_pair_elem {
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2037:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'long' to 'std::__ndk1::__compressed_pair_elem<JSONValue **, 0, false>' for 1st argument
struct __compressed_pair_elem {
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2049:3: note: candidate template ignored: substitution failure [with _Up = long, = void]
__compressed_pair_elem(_Up&& __u)
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2054:3: note: candidate constructor template not viable: requires 3 arguments, but 1 was provided
__compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2043:13: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
constexpr __compressed_pair_elem() : __value_() {}
^
2 errors generated.
ninja: build stopped: subcommand failed.
有人 #define nullptr 0
,这就是破坏它的原因。这不是STL的错。你应该找到拥有 #define nullptr
的人并告诉他们停止。
我正在将旧项目更新到最新的 android 构建系统。 Android Studio 3.1.2 和 clang/libc++。该项目使用 https://github.com/MJPA/SimpleJSON 并且无法像使用 gcc 那样进行编译。
我不知道 vector 在 libc++ 中是如何实现的,但似乎默认构造函数试图用 NULL 或其他东西实例化 JSONValue * 而这失败了?
有没有可能我没有在编译中启用正确的定义? include/memory 中的模板专业化位于一个块中,该块仅在 _LIBCPP_CXX03_LANG 未定义时定义。我检查过,这是源代码中唯一检查该定义的地方。我正在使用 -std=c++11 进行编译,那会包含 CXX03 功能吗?:
class JSONValue;
typedef std::vector<JSONValue *> JSONArray;
class JSONValue
{
friend class JSON;
public:
JSONValue(/*NULL*/);
JSONValue(const TCHAR *m_char_value);
JSONValue(const tstring &m_string_value);
JSONValue(bool m_bool_value);
JSONValue(double m_number_value);
JSONValue(const JSONArray &m_array_value);
JSONValue(const JSONObject &m_object_value);
~JSONValue();
JSONValue *Clone() const;
bool IsNull() const;
bool IsString() const;
bool IsBool() const;
bool IsNumber() const;
bool IsArray() const;
bool IsObject() const;
// change the internal type of the JSONValue so that we can keep the contained objects around for
// another instance to clean up. be VERY careful about using this unless you know how to clean up
// memory in a map of pointers on your own. This is major hack territory but it was the fastest
// way to fix a double free without completely changing the printer discovery call chain.
void Detach(void) { type = JSONType_Null; };
const tstring &AsString() const;
bool AsBool() const;
double AsNumber() const;
const JSONArray &AsArray() const;
const JSONObject &AsObject() const;
tstring Stringify() const;
JSONValue* CopyObjectField(const TCHAR *fieldname);
protected:
static JSONValue *Parse(const TCHAR **data);
private:
static tstring StringifyString(const tstring &str);
JSONValue *CloneSimpleValue(const JSONValue *);
JSONValue *RecursiveCloneObject(const JSONObject &inobj) const;
JSONValue *RecursiveCloneArray(const JSONArray &inarray) const;
JSONType type;
tstring string_value;
bool bool_value;
double number_value;
JSONArray array_value;
JSONObject object_value;
};
JSONValue array;
JSONValue 对象的实例化在编译期间导致以下失败:
FAILED: C:\Users\kmurphy\AppData\Local\Android\sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android --gcc-toolchain=C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64 --sysroot=C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sysroot -ID:/SPTX/Include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/android/support/include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++abi/include -isystem C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sysroot/usr/include/x86_64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -std=c++11 -frtti -fexceptions -x c++ -O0 -fno-limit-debug-info -fPIC -MD -MT D:/SPTX/Builds/Android/tlibJSON/x86_64/CMakeFiles/tlibJSON.dir/JSONValue.cpp.o -MF D:\SPTX\Builds\Android\tlibJSON\x86_64\CMakeFiles\tlibJSON.dir\JSONValue.cpp.o.d -o D:/SPTX/Builds/Android/tlibJSON/x86_64/CMakeFiles/tlibJSON.dir/JSONValue.cpp.o -c D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp
In file included from D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:25:
In file included from D:\SPTX\Projects\Parsers\tlibJSON/stdafx.h:6:
In file included from D:/SPTX/Include/tlibTYPES_android.h:16:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string:470:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string_view:169:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\__string:56:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\algorithm:643:
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2050:9: error: cannot initialize a member subobject of type 'JSONValue **' with an rvalue of type 'long'
: __value_(_VSTD::forward<_Up>(__u)){};
^ ~~~~~~~~~~~~~~~~~~~~~~~~
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2135:9: note: in instantiation of function template specialization 'std::__ndk1::__compressed_pair_elem<JSONValue **, 0, false>::__compressed_pair_elem<long, void>' requested here
: _Base1(std::forward<_Tp>(__t)), _Base2() {}
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:423:7: note: in instantiation of function template specialization 'std::__ndk1::__compressed_pair<JSONValue **, std::__ndk1::allocator<JSONValue *> >::__compressed_pair<long, true>' requested here
__end_cap_(nullptr)
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:473:5: note: in instantiation of member function 'std::__ndk1::__vector_base<JSONValue *, std::__ndk1::allocator<JSONValue *> >::__vector_base' requested here
vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
^
D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:228:13: note: in instantiation of member function 'std::__ndk1::vector<JSONValue *, std::__ndk1::allocator<JSONValue *> >::vector' requested here
JSONArray array;
^
In file included from D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:25:
In file included from D:\SPTX\Projects\Parsers\tlibJSON/stdafx.h:6:
In file included from D:/SPTX/Include/tlibTYPES_android.h:16:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string:470:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\string_view:169:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\__string:56:
In file included from C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\algorithm:643:
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2145:9: error: no matching constructor for initialization of '__compressed_pair_elem<JSONValue **, 0>'
: _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {}
^ ~~~~~~~~~~~~~~~~~~~~~~~
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\__split_buffer:309:7: note: in instantiation of function template specialization 'std::__ndk1::__compressed_pair<JSONValue **, std::__ndk1::allocator<JSONValue *> &>::__compressed_pair<long, std::__ndk1::allocator<JSONValue *> &>' requested here
: __end_cap_(nullptr, __a)
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:1567:49: note: in instantiation of member function 'std::__ndk1::__split_buffer<JSONValue *, std::__ndk1::allocator<JSONValue *> &>::__split_buffer' requested here
__split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\vector:1588:9: note: in instantiation of function template specialization 'std::__ndk1::vector<JSONValue *, std::__ndk1::allocator<JSONValue *> >::__push_back_slow_path<JSONValue *const &>' requested here
__push_back_slow_path(__x);
^
D:\SPTX\Projects\Parsers\tlibJSON\JSONValue.cpp:256:10: note: in instantiation of member function 'std::__ndk1::vector<JSONValue *, std::__ndk1::allocator<JSONValue *> >::push_back' requested here
array.push_back(value);
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2037:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'long' to 'const std::__ndk1::__compressed_pair_elem<JSONValue **, 0, false>' for 1st argument
struct __compressed_pair_elem {
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2037:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'long' to 'std::__ndk1::__compressed_pair_elem<JSONValue **, 0, false>' for 1st argument
struct __compressed_pair_elem {
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2049:3: note: candidate template ignored: substitution failure [with _Up = long, = void]
__compressed_pair_elem(_Up&& __u)
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2054:3: note: candidate constructor template not viable: requires 3 arguments, but 1 was provided
__compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
^
C:/Users/kmurphy/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\memory:2043:13: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
constexpr __compressed_pair_elem() : __value_() {}
^
2 errors generated.
ninja: build stopped: subcommand failed.
有人 #define nullptr 0
,这就是破坏它的原因。这不是STL的错。你应该找到拥有 #define nullptr
的人并告诉他们停止。