简体   繁体   English

Clang,std :: shared_ptr和std :: less / operator

[英]Clang, std::shared_ptr and std::less/operator<

Having the following code 拥有以下代码

#include <memory>

int main() {
    std::shared_ptr<int> ptr0( new int );
    std::shared_ptr<int> ptr1( new int );

    bool result = ptr0 < ptr1;
}

produces the following error when being compiled with clang (version 3.1, LLVM 3.1, Debian GNU/Linux Sid) 使用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
      ^

Compiling the same code with GCC (version 4.7.0) doesn't throw any error messages. 使用GCC(版本4.7.0)编译相同的代码不会抛出任何错误消息。 Is there a reason why operator<() doesn't work for shared pointers in clang? 运算符<()是否适用于clang中的共享指针?

clang++ and libstdc++ doesn't match perfectly yet. clang ++和libstdc ++完全不匹配。 You could do one of the followings: 您可以执行以下操作之一:

  • Switch to libc++ (by using clang++ -stdlib=libc++ -std=c++11 ... ) 切换到libc ++(使用clang++ -stdlib=libc++ -std=c++11 ...
  • Apply the following patch to /usr/include/c++/4.7.0/type_traits (as documented in http://clang.llvm.org/cxx_status.html ): 将以下补丁应用于/ /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...> 

If you check bits/shared_ptr.h you did find a std::common_type , and the clang developers claim that it's actually a bug of libstdc++ , although I don't believe a bug of libstdc++ alone would cause the non-existent type int*&&& to appear. 如果检查bits/shared_ptr.h你确实发现了一个std::common_type ,并且clang开发人员声称它实际上是libstdc ++的一个错误 ,虽然我不相信libstdc ++的错误会导致不存在的类型int*&&&出现。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM