在實現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;
}