在实现BS树时,我注意到一些自从我开始使用C++ 11智能指针后不太确定的事情,这让我很奇怪为什么会这样。下面的代码工作正常,如果我使用init-brace对{}而不是括号;我个人规则是看重初始化每个成员(直接或通过构造函数),并自节点::右和节点::留下都是智能指针,因此,nullptr它。 问题1:为什么括号失败并且init-brace对成功?仅在这种情况下,两者之间是否有语义上的区别?将常量左值与右值引用绑定
在BST,在带有std的构造函数:: initializer_list,我明白的std :: initializer_list元素仅能够复制,根据this。所以如果我没有错的话,根据最近GN13的Scott Meyer的说法,对const对象进行移动只会触发对象的copy-ctor。
Quesion 2为什么编译失败对象在通话复制到BST ::插入(T & &)?
#include <memory>
template<typename T>
struct Node
{
//~ std::unique_ptr<Node<T>> left (nullptr), right (nullptr);
std::unique_ptr<Node<T>> left { nullptr }, right { nullptr };
Node<T> *parent = nullptr;
T value { };
Node<T>() = default;
Node<T> (T && val, Node<T> * _left = nullptr, Node<T> *_right = nullptr,
Node<T> *_parent = nullptr): left(_left), right (_right), parent(_parent),
value (std::move(val))
{
}
};
template<typename T>
struct BinarySearchTree
{
std::unique_ptr<Node<T>> root;
BinarySearchTree(): root { nullptr } { }
BinarySearchTree(std::initializer_list<T> && lst): BinarySearchTree { }{
//If the below code were changed to
//~ for(auto && i: lst){ it would be an error
for(typename std::remove_reference<typename std::remove_const<T>::type>::type i: lst){
this->insert(std::move(i));
}
}
void insert(T && v) { }
};
int main(){
BinarySearchTree<int> a { 11, 24 };
return 0;
}