使用此指针作为右值

Use of this pointer as rvalue

我的代码似乎可以正常工作,尽管我对它有一种不好的感觉。

我的 class Node 有私有成员:

// Node properties
std::string m_keySymbol = "";
float m_nodeWeight = 0.0f;
std::string m_displaySymbol = "";

// Ultimately will be either 0x00 or 0x01.  This is a starting and testable value.
//std::uint8_t m_branchBitValue = 0xFF;

// Node relationships
Node* mp_parentNode = nullptr;

//std::pair<Node*, Node*> mp_childNodes = { nullptr, nullptr };
NodeBranches m_nodeBranches;
bool m_nodeHasBranches = false;

和定义为:

的方法
Node::Node(Node& left, Node& right) {

    m_keySymbol = left.m_keySymbol + right.m_keySymbol;
    m_nodeWeight = left.m_nodeWeight + right.m_nodeWeight;
    m_displaySymbol = left.m_displaySymbol + right.m_displaySymbol;

    m_nodeHasBranches = true;
    m_nodeBranches.left.first = const_cast<Node*>(&left);
    m_nodeBranches.left.second = 0x00;
    m_nodeBranches.right.first = const_cast<Node*>(&right);
    m_nodeBranches.right.second = 0x01;

    left.mp_parentNode = this;
    right.mp_parentNode = this;
}

我特别关心的是 Node::Node(Node& left, Node& right) 的最后两行,特别是我使用 this 作为右值的地方。

main() 中,以下代码有效:

    // Start the combining process.
    Node cb(nodesVector[0], nodesVector[1]);

    std::cout << "Address of cb: " << std::hex << &cb << std::endl;
    std::cout << "Parent node of nodesVector[0]: " << std::hex << nodesVector[0].GetParentNode() << std::endl;

cb 的地址与 nodesVector[0].GetParentNode() 返回的地址匹配,returns mp_parentNode.

我看过但找不到 this 用作右值的示例,即使它被定义为具有右值属性的纯右值表达式。

我是不是漏掉了什么?

My specific concern is with ... specifically where I have used this as a rvalue.

这没什么好担心的。如您所说,this 是一个纯右值表达式。纯右值是右值,只能用作右值。

您应该关心的是存储指向引用参数的指针。很容易意外地将构造函数用于生命周期在构造节点之前结束的对象。我建议改用指针参数,这样调用者会更清楚地知道将存储指向对象的指针。也仔细记录一下。

此外,const_cast 是多余的。