如何防止警告C4355:'this':用于基本成员初始化列表

时间:2013-09-23 13:48:04

标签: c++ constructor this compiler-warnings

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

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;
}

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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