std::initializer_list 到 return 成员变量 return 的值不正确
std::initializer_list to return member variables returns incorrect values
使用 std::initializer_list
从函数返回多个值是否有任何问题?在下面的代码中,当我尝试打印使用 [=15=] 返回的值时,我得到了垃圾值。
头文件
#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
不是容器,您不能将它用于 return 函数中的项目列表。当你写下
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]
在您的代码中,包含 a
和 b
副本的临时数组在函数 return_init_list()
returns 时不复存在。使用 std::pair
或 std::tuple
到 return 值。
使用 std::initializer_list
从函数返回多个值是否有任何问题?在下面的代码中,当我尝试打印使用 [=15=] 返回的值时,我得到了垃圾值。
头文件
#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
不是容器,您不能将它用于 return 函数中的项目列表。当你写下
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]
在您的代码中,包含 a
和 b
副本的临时数组在函数 return_init_list()
returns 时不复存在。使用 std::pair
或 std::tuple
到 return 值。