拥有以下代码
#include <memory>
int main() {
std::shared_ptr<int> ptr0( new int );
std::shared_ptr<int> ptr1( new int );
bool result = ptr0 < ptr1;
}
使用clang(版本3.1,LLVM 3.1,Debian GNU / Linux Sid)编译时,产生以下错误
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/shared_ptr.h:364:14: error: no matching function for call to object of type 'std::less<_CT>'
return std::less<_CT>()(__a.get(), __b.get());
^~~~~~~~~~~~~~~~
foo.cpp:9:21: note: in instantiation of function template specialization 'std::operator<<int, int>' requested here
bool result = ptr0 < ptr1;
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/stl_function.h:236:7: note: candidate function not viable: no known conversion from 'int *' to 'int *&&&' for
1st argument;
operator()(const _Tp& __x, const _Tp& __y) const
^
使用GCC(版本4.7.0)编译相同的代码不会抛出任何错误消息。运算符&lt;()不能用于clang中的共享指针吗?
答案 0 :(得分:12)
clang ++和libstdc ++完全不匹配。您可以执行以下操作之一:
clang++ -stdlib=libc++ -std=c++11 ...
)将以下修补程序应用于/usr/include/c++/4.7.0/type_traits
(如http://clang.llvm.org/cxx_status.html中所述):
Index: include/std/type_traits
===================================================================
--- include/std/type_traits (revision 185724)
+++ include/std/type_traits (working copy)
@@ -1746,7 +1746,7 @@
template<typename _Tp, typename _Up>
struct common_type<_Tp, _Up>
- { typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; };
+ { typedef typename decay<decltype(true ? declval<_Tp>() : declval<_Up>())>::type type; };
template<typename _Tp, typename _Up, typename... _Vp>
struct common_type<_Tp, _Up, _Vp...>
如果你检查bits/shared_ptr.h
,你确实找到了std::common_type
,并且clang开发者声称it's actually a bug of libstdc++,虽然我不相信libstdc ++的错误会导致不存在输入int*&&&
即可显示。