抑制单行 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