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

标签 c++ c++11 initializer-list

使用 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 返回值。

关于c++ - std::initializer_list 返回成员变量返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877850/

相关文章:

c++ - QtCreator 项目上的 "Symbol(s) not found for architecture x86_64"

c++ - mingw中发送信号的 "kill"函数在哪里?

c++ - 返回一个右值——这段代码有什么问题?

c++ - 为什么初始化列表允许在 C++ 中缩小类型?

c++ - 异构初始化列表

c++ - 连接到一个相当大的应用程序

c++ - "typedef iterator<const value_type> const_iterator;"结果为 : "error: expected member name or ' ; ' after declaration specifiers"

c++ - std::decay 和按值传递之间有什么区别?

c++ - 这段代码不应该导致死锁吗?

c++ - 创建抽象基类型引用的初始化列表