Использование этого указателя в качестве значения rvalue - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть код, который, кажется, работает, хотя у меня плохое предчувствие.

Мой 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;
}

Моя специфика c касается последних двух строк 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(), что возвращает mp_parentNode.

Я посмотрел и не могу найти пример где this используется в качестве значения rvalue, даже если оно определено как выражение prvalue со свойствами свойства rvalue.

Я что-то упустил?

1 Ответ

0 голосов
/ 24 апреля 2020

Моя конкретная проблема c связана с ... в частности, где я использовал это как значение.

В этом нет ничего страшного. Как вы сказали, this является выражением prvalue. Prvalues ​​- это r-значения, и их можно использовать только как r-значение.

Что вас должно беспокоить, так это хранение указателей на ссылочные аргументы. Очень легко случайно использовать конструктор с объектами, время жизни которых заканчивается до созданного узла. Вместо этого я рекомендую использовать аргументы-указатели, чтобы вызывающему было немного понятнее, что указатель на объект будет сохранен. Также тщательно запишите это.

Кроме того, const_cast s являются избыточными.

...