我不能直接在 C++ 中 return 列表初始化吗?
Can't I return a list initialization directly in C++?
struct vec2{float x,y;};
这会起作用:
vec2* window(float h, float w)
{
vec2 ret[4] = {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
return ret;
}
但这不会:
vec2* window(float h, float w)
{
return {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
}
我猜错误是因为后者没有指定数组的大小,但我不知道我是否遗漏了什么...
我也试过:
return vec2[4]({{w,h},{1-w,h},{1-w,1-h},{w,1-h}});
This will work:
不,不会。您正在返回指向本地数组的指针。指针立即失效。
指针不是数组。这也是您的初始化失败的原因之一:编译器实际上没有办法知道这个:
vec2* ptr = {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
应该是这样的:
vec2 ret[4] = {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
vec2* ptr = ret;
后者的初始化只起作用,因为编译器知道你正在初始化的是 vec2[4]
。
您应该完全重新考虑这一点,可能会返回 std::array<vec2, 4>
。按价值。
你不能return一个数组值,你不能return一个指向自动或临时对象的指针,因为它会在函数returns,使指针无效。
Return std::array
如果大小是已知的小常量或 std::vector
否则。
struct vec2{float x,y;};
这会起作用:
vec2* window(float h, float w)
{
vec2 ret[4] = {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
return ret;
}
但这不会:
vec2* window(float h, float w)
{
return {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
}
我猜错误是因为后者没有指定数组的大小,但我不知道我是否遗漏了什么...
我也试过:
return vec2[4]({{w,h},{1-w,h},{1-w,1-h},{w,1-h}});
This will work:
不,不会。您正在返回指向本地数组的指针。指针立即失效。
指针不是数组。这也是您的初始化失败的原因之一:编译器实际上没有办法知道这个:
vec2* ptr = {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
应该是这样的:
vec2 ret[4] = {{w,h},{1-w,h},{1-w,1-h},{w,1-h}};
vec2* ptr = ret;
后者的初始化只起作用,因为编译器知道你正在初始化的是 vec2[4]
。
您应该完全重新考虑这一点,可能会返回 std::array<vec2, 4>
。按价值。
你不能return一个数组值,你不能return一个指向自动或临时对象的指针,因为它会在函数returns,使指针无效。
Return std::array
如果大小是已知的小常量或 std::vector
否则。