我不能直接在 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 否则。