【问题标题】:How to deal with IntelliSense not being able to recognize C++20 features?如何处理 IntelliSense 无法识别 C++20 功能?
【发布时间】:2022-10-23 18:06:19
【问题描述】:

IntelliSense 经常落后于 C++ 开发并不是什么新鲜事。

例如,下面的代码在 C++20 中有效,使用新的模板字符串文字运算符功能。

template<typename C, size_t Size>
struct StrWrapper
{
    std::array<C, Size> m_buf;
    consteval StrWrapper(const C(&str)[Size]) : m_buf{}
    {
        std::copy(str, str + Size, m_buf.begin());
    }
};

template <StrWrapper c>
consteval auto operator ""_wrap()
{
    return c;
}

"hello world"_wrap;

但是 IntelliSense 会报告这些错误:

E2500   a literal operator template must have a template parameter list equivalent to '<char ...>'
E2486   user-defined literal operator not found

我发现其他人也有同样的问题,开发者社区有两个报告,the earliest one 是从 2021 年 1 月开始的,已经快两年了。

看起来微软不想解决这个问题,因为这个功能有点不经常使用,而且他们仍然在模块上苦苦挣扎。

有没有办法解决这个问题?我已经寻找一种方法来禁用 IntelliSense 中的特定错误,但似乎没有。实际上,有one,但在这种情况下它无济于事,因为使用""_wrap 的每个字符串都必须在__INTELLISENSE__ 预处理器块中。

【问题讨论】:

  • 有解决这个问题的希望吗?
  • 您是否尝试过添加template deduction guide
  • @viraltaco_ 谢谢,但在这种情况下它不起作用,我学到了一些新东西
  • @viraltaco_ 它对我不起作用,here 是一个图像,它编译得很好,但智能感知仍然抱怨。
  • @thedemons 也许您可以为 IntelliSense 提供一个虚拟实现:consteval StrWrapper&lt;char, 1&gt; operator""_wrap(const char * s, size_t len) { return StrWrapper(""); } 如果定义了 __INTELLISENSE__。请参阅godbolt 上的示例。根据您使用它的方式,IntelliSense 可能不会抱怨。这可行吗?

标签: c++ visual-studio visual-c++ intellisense


【解决方案1】:

根据您之后如何使用运算符的返回值,您可能会通过为 IntelliSense 提供一个虚拟实现来满足 IntelliSense:

#include <array>

template <typename C, size_t Size>
struct StrWrapper
{
  std::array<C, Size> m_buf;
  consteval StrWrapper(const C (&str)[Size])
    : m_buf{}
  {
    std::copy(str, str + Size, m_buf.begin());
  }
};

#ifndef __INTELLISENSE__

template <StrWrapper c>
consteval auto operator""_wrap()
{
  return c;
}

#else

// Dummy, only seen by IntelliSense.
consteval StrWrapper<char, 1> operator""_wrap(const char * s, size_t len) 
{
  return StrWrapper("");
}

#endif

void foo()
{
  constexpr auto t = "hello world"_wrap;
}

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2021-06-30
    • 2021-01-22
    • 2019-08-01
    • 2011-10-01
    相关资源
    最近更新 更多