返回成员变量的std::initializer_list返回不正确的值

std::initializer_list to return member variables returns incorrect values

本文关键字:返回 list 不正确 initializer std 成员 变量      更新时间:2023-10-16

使用std::initializer_list从函数返回多个值有问题吗。在下面的代码中,当我尝试打印使用std::initializer_list返回的值时,我得到的是垃圾值。

头文件

#ifndef _C17_CONSTRUCT_3_HPP
#define _C17_CONSTRUCT_3_HPP
#include <iostream>
#include <string>
#include <initializer_list>
class A {
    public:
        A(int a,int b):a{a},b{b}{}
        std::initializer_list<int> return_init_list()
        {
            std::initializer_list<int> local_list = {a, b};
            std::cout<<"a "<<a<<" b "<<b<<std::endl;
            return local_list;
        }
    private:
        int a{9};
        int b{10};
};
#endif

源文件

#include "c17_construct_3.hpp"
int main()
{
    A a{9, 10};
    std::initializer_list<int> ret = a.return_init_list();
    std::cout<<"ret list size "<<ret.size()<<std::endl;
    for(auto list_elem : ret)
        std::cout<<list_elem<<std::endl;
}

输出

a 9 b 10  
ret list size 2  
-1489302992  
32692  

std::initializer_list不是容器,不能使用它从函数返回项列表。当您编写以下时

std::initializer_list<int> local_list = {a, b};

编译器将其翻译成功能类似于以下的代码

const int __temp_array[2] = {a, b};
std::initializer_list<int> local_list{__temp_array, __temp_array + 2};  
// the above line assumes the implementation has access to such a constructor

在标准-§8.5.4/5[dcl.init.list]中可以找到一个几乎相同的例子

在代码中,当函数return_init_list()返回时,包含ab副本的临时数组将不存在。使用std::pairstd::tuple返回值。