抑制单行 MSVC19 C++20 的编译器错误
Suppress compiler error for a single line MSVC19 C++20
我想检查 shared_ptr
是否未初始化,即它是否是 nullptr
或者它是否具有默认值(如果使用 [=15= 创建就会出现这种情况) ]).为此,我编写了一段代码来检查共享指针是否具有默认构造值 class/struct。为此,我还需要知道 class/struct 是否定义了 operator==
并弄清楚我有 has_equate
。检查共享指针是否未初始化的代码是:
template<class L, class R = L>
concept has_equate = requires(const L & lhs, const R & rhs)
{
{ lhs == rhs } -> std::same_as<bool>;
};
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if(has_equate<T>) {
T tmp;
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
如果我没有为我的 class/struct 定义 operator==
,上面的代码行会出现以下错误:
Error C2678 binary '==': no operator found which takes a left-hand operand of type 'T' (or there is no acceptable conversion)
因为在继续检查给定的共享指针是否具有默认构造值之前,我正在使用 has_equate
检查 class/struct 的 operator==
是否存在,所以我会想抑制此特定代码行的此错误。
到目前为止我尝试过的:
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if(has_equate<T>) {
T tmp;
#pragma warning(suppress: 2678)
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
#pragma warning(push)
#pragma warning(disable: 2678)
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if(has_equate<T>) {
T tmp;
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
#pragma warning(pop)
None 它正在工作(我假设这是因为 C2678 是错误而不是警告)。有没有一种方法可以抑制 if(*shared == tmp)
代码行或 isSharedPtrUninitialized
函数的错误,因为我不想对整个事情都这样做。
感谢@molbdnilo提供解决方案。工作函数为:
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if constexpr (has_equate<T>) {
T tmp;
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
使用 if constexpr
而不是 if
解决了我的问题。如果对这两者之间的区别感到好奇,请查看 SO 上的 post 。
我想检查 shared_ptr
是否未初始化,即它是否是 nullptr
或者它是否具有默认值(如果使用 [=15= 创建就会出现这种情况) ]).为此,我编写了一段代码来检查共享指针是否具有默认构造值 class/struct。为此,我还需要知道 class/struct 是否定义了 operator==
并弄清楚我有 has_equate
。检查共享指针是否未初始化的代码是:
template<class L, class R = L>
concept has_equate = requires(const L & lhs, const R & rhs)
{
{ lhs == rhs } -> std::same_as<bool>;
};
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if(has_equate<T>) {
T tmp;
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
如果我没有为我的 class/struct 定义 operator==
,上面的代码行会出现以下错误:
Error C2678 binary '==': no operator found which takes a left-hand operand of type 'T' (or there is no acceptable conversion)
因为在继续检查给定的共享指针是否具有默认构造值之前,我正在使用 has_equate
检查 class/struct 的 operator==
是否存在,所以我会想抑制此特定代码行的此错误。
到目前为止我尝试过的:
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if(has_equate<T>) {
T tmp;
#pragma warning(suppress: 2678)
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
#pragma warning(push)
#pragma warning(disable: 2678)
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if(has_equate<T>) {
T tmp;
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
#pragma warning(pop)
None 它正在工作(我假设这是因为 C2678 是错误而不是警告)。有没有一种方法可以抑制 if(*shared == tmp)
代码行或 isSharedPtrUninitialized
函数的错误,因为我不想对整个事情都这样做。
感谢@molbdnilo提供解决方案。工作函数为:
template <typename T>
bool isSharedPtrUninitialized(const std::shared_ptr<T>& shared)
{
if(shared) {
if constexpr (has_equate<T>) {
T tmp;
if(*shared == tmp)
return true;
}
return false;
}
return true;
}
使用 if constexpr
而不是 if
解决了我的问题。如果对这两者之间的区别感到好奇,请查看 SO 上的 post