【发布时间】:2019-01-07 10:57:43
【问题描述】:
在为树编写一些代码时出错,我遇到了以下奇怪情况。我已经对这个例子做了很多剥离,所以它只是一个线性树。
基本上,在 main() 函数中,我想将一个节点附加到我的树上,但我没有将它附加到“tree.root”,而是将它附加到“root”。然而,令我惊讶的是,它不仅编译得很好,而且我能够在节点上调用方法。只有当我尝试访问“value”成员变量时才会出错。
我想我的主要问题是,为什么编译器没有捕捉到这个错误?
std::shared_ptr<Node> root = tree.AddLeaf(12, root);
由于 RHS 上的“根”是一个完全未声明的变量。另外,出于好奇,如果编译器允许它们通过,循环定义是否有实际用例?以下是其余代码:
#include <iostream>
#include <memory>
struct Node
{
int value;
std::shared_ptr<Node> child;
Node(int value)
: value {value}, child {nullptr} {}
int SubtreeDepth()
{
int current_depth = 1;
if(child != nullptr) return current_depth + child->SubtreeDepth();
return current_depth;
}
};
struct Tree
{
std::shared_ptr<Node> root;
std::shared_ptr<Node> AddLeaf(int value, std::shared_ptr<Node>& ptr)
{
if(ptr == nullptr)
{
ptr = std::move(std::make_shared<Node>(value));
return ptr;
}
else
{
std::shared_ptr<Node> newLeaf = std::make_shared<Node>(value);
ptr->child = std::move(newLeaf);
return ptr->child;
}
}
};
int main(int argc, char * argv[])
{
Tree tree;
std::shared_ptr<Node> root = tree.AddLeaf(12, root);
std::shared_ptr<Node> child = tree.AddLeaf(16, root);
std::cout << "root->SubtreeDepth() = " << root->SubtreeDepth() << std::endl;
std::cout << "child->SubtreeDepth() = " << child->SubtreeDepth() << std::endl;
return 0;
}
输出:
root->SubtreeDepth() = 2
child->SubtreeDepth() = 1
【问题讨论】:
-
int x = x + 1;什么错误?你预计会发生什么? -
首先初始化变量(int std::shared_ptr 的情况为空指针),然后执行赋值。尝试使用构造函数,它不会被允许。
-
@rkapl 不,在这种情况下,直到 RHS 完成,变量才会被初始化。该声明称为copy initialization。
-
@Ruslan -- 你是对的,谢谢。