【发布时间】: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<char, 1> operator""_wrap(const char * s, size_t len) { return StrWrapper(""); }如果定义了__INTELLISENSE__。请参阅godbolt 上的示例。根据您使用它的方式,IntelliSense 可能不会抱怨。这可行吗?
标签: c++ visual-studio visual-c++ intellisense