如何防止警告 C4355:'this':在基本成员初始值设定项列表中使用

How to prevent warning C4355: 'this' : used in base member initializer list

本文关键字:列表 C4355 警告 何防止 this 成员      更新时间:2023-10-16

我的问题与此类似,但我没有找到我需要的信息。我有我的类构造函数。

CustomTreeViewItem::CustomTreeViewItem(CustomTreeView* list) 
    : m_childs(), m_expanded(false), m_list(list), m_components(), m_depth(1), 
    m_rect(), m_root(this)
{}

我在构造函数中使用this指针,但不从中调用任何方法,因此不会调用未定义的行为。所以一切都很好,但我得到了警告,现在我正在编写一些 lib(小框架),所以我必须编写无错误的代码。所以我把我的代码改成这样:

CustomTreeViewItem::CustomTreeViewItem(CustomTreeView* list) 
    : m_childs(), m_expanded(false), m_list(list), m_components(), m_depth(1), 
    m_rect(), m_root(NULL)
{
    m_root = this;
}

现在我没有得到任何警告,但是通过这种方式我失去了性能(非常轻微,但无论如何都是损失)。我想问一下是否有任何方法可以保持最高性能并防止此警告。

如果指针仅存储以供以后使用,则标准保证这是完全安全的。

您可能需要使用杂注来禁用警告。 警告控制是不可移植的(其他编译器可能会忽略您的杂注并继续警告)。

首先是编译器不应该抱怨这一点,接下来是代码的替代版本,其中m_root设置为 NULL(应该是 nullptr ),后来设置为 this 很可能根本不会对性能产生影响。任何优化编译器都应该能够将两个写入合并为一个具有this的写入。看看程序集。即使这触发了额外的写入,变量也是的,所以它只是一个L1写入,成本不会很明显。