C++ std::vector vs std::initializer_列表问题:未定义bahevior

C++ std::vector vs std::initializer_列表问题:未定义bahevior,c++,c++11,vector,initializer-list,C++,C++11,Vector,Initializer List,我将此帮助器方法附加到链接列表(下面的代码): void append(const std::initializer_list&vals){ 用于(常数自动和val:val) 追加(val); } 我首先尝试用std::vector附加1,5,7,9,如下所示: void append(const std::vector<T>& vals) { for (const auto&

我将此帮助器方法附加到链接列表(下面的代码):

void append(const std::initializer_list&vals){
用于(常数自动和val:val)
追加(val);
} 
我首先尝试用std::vector附加1,5,7,9,如下所示:

void append(const std::vector<T>& vals) {                               
            for (const auto& val : vals)                                                    
              append(val);                                                                  
} 
void append(const std::vector&vals){
用于(常数自动和val:val)
追加(val);
} 
但是它用0,0,7,9而不是1,5,7,9填充了链表。你知道为什么吗

以下是完整的代码:

    template <typename T>                                                               
    class LinkedList {                                                                  
    private:                                                                            
      struct Node {                                                                     
        const T& val_;                                   
        std::shared_ptr<Node> next_ = nullptr;                                          
        Node(const T& val) : val_(val) {}                                               
      };                                                                                
    public:                                                                             
      std::shared_ptr<Node> head_ = nullptr;                                            
      std::shared_ptr<Node> current = nullptr;                                          

      // could be optimized                                                                                 
      void append(const std::initializer_list<T>& vals) {                               
        for (const auto& val : vals)                                                    
          append(val);                                                                  
      }                                                                                 

      void append(const T& val) {                                                       
        if (!head_) {                                                                   
          head_ = std::make_shared<Node>(val);                                          
          return;                                                                       
        }                                                                               
        current = head_;                                                                
        while (current->next_)                                                          
          current = current->next_;                                                     
        current->next_ = std::make_shared<Node>(val);                                   
      }                                                                                 

      template <typename Func>                                                          
      void for_each(Func f) {                                                           
        current = head_;                                                                
        while (current) {                                                               
          f(current->val_);                                                             
          current = current->next_;                                                     
        }                                                                               
      }                                                                                 


    };                                                                               

    int main() {                                                                     
      LinkedList<int> lst;                                                           
      lst.append({1,5,7,9});                                                         
      auto printer = [](int val) {                                                   
        std::cout << val << " ";                                                     
      };                                                                             
      lst.for_each(printer);                                                         
      std::cout << '\n';                                                                            
    }                                 
模板
类链接列表{
私人:
结构节点{
康斯特瓦勒;
std::shared\u ptr next\uu=nullptr;
节点(const T&val):val_(val){}
};                                                                                
公众:
标准::共享头=空头;
std::shared_ptr current=nullptr;
//可以优化
void append(const std::初始值设定项\u list&vals){
用于(常数自动和val:val)
追加(val);
}                                                                                 
无效附加(常量T&val){
如果(!头){
头=标准::使共享(val);
返回;
}                                                                               
电流=水头;
while(当前->下一步)
当前=当前->下一步;
当前->下一步=标准::使共享(val);
}                                                                                 
模板
_each(Func f){
电流=水头;
当(当前){
f(当前->值);
当前=当前->下一步;
}                                                                               
}                                                                                 
};                                                                               
int main(){
LinkedList lst;
lst.append({1,5,7,9});
自动打印机=[](int-val){

std::cout这里的一个编程错误是您的节点存储了一个引用
const T&val;
。而是存储值
const T val;

这里的一个编程错误是您的节点存储了一个引用
const T&val;
。而是存储值
const T val;

您是否已通过代码来执行此操作看到它在做什么了吗?为什么有任意数量的右尾随间距?在这两种情况下,节点都存储一个悬空引用。“这是完整的代码”嗯,那么你应该读@John。这是一项非常重要的技能,在大多数情况下,它可以发现你的大部分问题。这里有一个关于如何调试小程序的好链接:你是否仔细阅读了代码以了解它在做什么?为什么你有任意数量的右尾随间距?在这两种情况下,节点都会存储一个悬空引用。“这是完整的代码”嗯,那你应该读@John。这是一项非常重要的技能,在大多数情况下,它可以发现你的大部分问题。这是一个关于如何调试小程序的好链接:哦,我猜这是一个未定义的行为,这就是为什么我看到它适用于初始值设定项\u list而不是vector?你也提到了”一个编程错误“.你看到其他人了吗?@John这是我注意到的第一件事,因为我避开了引用成员。我没有发现其他任何东西。哦,所以我猜还有未定义的行为,这就是为什么我看到它对初始值设定项而不是向量有效?你还提到了“一个编程错误”“。你看到其他人了吗?@John这是我注意到的第一件事,因为我避开了推荐人。我没有发现其他任何东西。
    template <typename T>                                                               
    class LinkedList {                                                                  
    private:                                                                            
      struct Node {                                                                     
        const T& val_;                                   
        std::shared_ptr<Node> next_ = nullptr;                                          
        Node(const T& val) : val_(val) {}                                               
      };                                                                                
    public:                                                                             
      std::shared_ptr<Node> head_ = nullptr;                                            
      std::shared_ptr<Node> current = nullptr;                                          

      // could be optimized                                                                                 
      void append(const std::initializer_list<T>& vals) {                               
        for (const auto& val : vals)                                                    
          append(val);                                                                  
      }                                                                                 

      void append(const T& val) {                                                       
        if (!head_) {                                                                   
          head_ = std::make_shared<Node>(val);                                          
          return;                                                                       
        }                                                                               
        current = head_;                                                                
        while (current->next_)                                                          
          current = current->next_;                                                     
        current->next_ = std::make_shared<Node>(val);                                   
      }                                                                                 

      template <typename Func>                                                          
      void for_each(Func f) {                                                           
        current = head_;                                                                
        while (current) {                                                               
          f(current->val_);                                                             
          current = current->next_;                                                     
        }                                                                               
      }                                                                                 


    };                                                                               

    int main() {                                                                     
      LinkedList<int> lst;                                                           
      lst.append({1,5,7,9});                                                         
      auto printer = [](int val) {                                                   
        std::cout << val << " ";                                                     
      };                                                                             
      lst.for_each(printer);                                                         
      std::cout << '\n';                                                                            
    }