返回成员变量的std::initializer_list返回不正确的值
std::initializer_list to return member variables returns incorrect values
使用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()
返回时,包含a
和b
副本的临时数组将不存在。使用std::pair
或std::tuple
返回值。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- 为什么 std::d istance() 对于 std:list:<int>:itrator 在 last 在 first 之前时不返回负数?
- pop_back() 在 std::list 中返回值?
- std::list.end() 不返回"past-the-end"迭代器
- C++ DLL 返回指向 std::list<std::wstring 的指针>
- 返回在函数中创建的 std::list 的第一个节点
- 如何正确地从dll返回std::list
- 如何编写一个C++函数,根据处理返回不同类型的std::list
- C++在函数中创建std::list并通过参数返回
- 如何在 std::vector 中查找重复项<strings>并返回一个 std::list 它们按字母顺序排序,在该结果列表中没有重复项
- 为什么 vector<> 和 list<> 容器中的push_back不返回对插入元素的引用?
- 将C++转换为Python:将std::list作为参数返回给Python
- 如何返回迭代器--list:<T>:迭代器,作为函数返回值
- 从迭代器返回一个std::list元素的引用
- 插入失败时list/map返回什么?
- 使用递归在List中查找int类型-何时返回
- 调用返回list的c++函数
- 返回list::迭代器