使用此指针作为右值
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
是多余的。
我的代码似乎可以正常工作,尽管我对它有一种不好的感觉。
我的 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
是多余的。