CLion 2017.3 无法使用 clang 5 通过 unique_ptr 自动完成(适用于 4.0.1)

CLion 2017.3 unable to autocomplete through unique_ptr using clang 5 (works with 4.0.1)

编辑:滚动到下面的粗体部分了解当前状态。

CLion 似乎无法自动完成 clang 5 中 unique_ptr 指向的类型的成员。我要么得到 "no suggestions",要么得到关于 [=13= 成员函数的建议] 本身:

但是,对于 4.0.1,一切正常:

我还注意到,如果我要求 CLion 跳转到 c->-> 的定义,在 4.0.1 中它会找到它:

    _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();}

但是在 5.0.0 中,同样的命令说:Cannot find declaration to go to,所以这似乎更接近问题的根源。

shared_ptr-><AUTOCOMPLETE> 在两个版本中都可以正常工作。

<memory>unique_ptr::operator-> 的 return 类型的代码简化为 element_type * 可以解决问题,但更改核心包含文件是'这不是我喜欢做的事情。 令人困惑的是,5.0 中的那部分代码与 4.0.1 中的代码相同,但工作正常。

  _LIBCPP_INLINE_VISIBILITY
  element_type * operator->() const _NOEXCEPT {
      return __ptr_.first();
  }  _LIBCPP_INLINE_VISIBILITY

    // original code that doesn't play nice with CLion
//    pointer operator->() const _NOEXCEPT {
//        return __ptr_.first();
//    }

我对任何解决方法感兴趣,甚至只是对导致此问题的原因进行解释。

我正在使用来自 llvm 下载站点的 Mac 预构建二进制文件。我想知道这是否是 Apple clang 编号方案与 real clang 版本号的问题。也许 clang 分析器认为我使用的是一些古老版本的 (apple) clang 而不是现代 "real" clang。

谢谢。

解决方法是更改​​ memory header 中 unique_ptr::operator-> 的 return 类型。

  _LIBCPP_INLINE_VISIBILITY
  element_type * operator->() const _NOEXCEPT {
      return __ptr_.first();
  }  _LIBCPP_INLINE_VISIBILITY

    // original code that doesn't play nice with CLion
//    pointer operator->() const _NOEXCEPT {
//        return __ptr_.first();
//    }

使事情正常进行并更接近地反映了 shared_ptr 中的工作方式,开箱即用。

我想在这里跟进,上面的(已接受的)解决方案也适用于 unique_ptr 的 libstdc++ 实现,至少是我正在使用的 GCC 8.1 附带的那个。

另一种解决方案,出于我详细说明的原因 ,您可以在结构的开头添加一个 using 指令,例如 using pointer = C*。这会愚弄 Netbeans 使其在没有警告的情况下正确地自动完成。此解决方案可能特定于 libstdc++,但根据您的回答,看起来 libc++ 在内部使用相同的类型名称作为指针。