(Visual Studio的)警告C4718究竟是什么

What exactly is warning C4718 (of Visual Studio)?

本文关键字:C4718 究竟 是什么 警告 Visual Studio      更新时间:2023-10-16

msdn链接

此处的文本:

"函数调用":递归调用没有副作用,删除

A函数包含一个递归调用,但在其他方面并没有副作用。正在删除对此函数的调用。程序不受影响,但行为受影响。而离开呼叫中可能导致运行时堆栈溢出异常,删除呼叫消除了这种可能性。

引起此警告的代码是:

template<class Key, class Value>
void Map<Key, Value>::Clear(NodeType* pNode)
{
    ((Key*) (pNode->m_key))->~Key();
    ((Value*) (pNode->m_item))->~Value();
    NodeType* pL = pNode->GetLeftChild();
    NodeType* pR = pNode->GetRightChild();
    if (pL != &m_dummy)
    {
        Clear(pL);
    }
    if (pR != &m_dummy)
    {
        Clear(pR);
    }
}

还有一点:这个警告只发生在版本构建(/Ox)中

这个警告是什么?谢谢

我敢打赌,当~Key~Value没有操作时,就会发生这种情况。编译器会注意到,这个函数实际上没有其他尝试,所以它完全消除了这个函数。

对于初学者来说,警告只发生在版本构建中,因为它是优化的结果,优化器只在版本构建期间运行。

如果优化器能够证明这不会改变程序行为,那么它可以重组或消除代码,包括递归调用可能有一些依赖于数据的路径,其中对左右节点的Clear()的一个或两个调用都没有效果

编辑:正如@MSchangers所指出的,Key和Value的析构函数更有可能没有操作——如果Key和Value都是普通的旧数据结构或简单类型,它们就会是这样,因为析构函数是编写的函数中唯一可能的副作用。

编辑2:与其使用placement new,为什么不使用:initializer?

template struct Map<typename Key, typename Value> {
    Key key;
    Value value;
    Map(Key k, Value v) : key(k), value(v) {}
}