c++ - 我不能直接在 C++ 中返回列表初始化吗?

标签 c++ initializer-list

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> .按值(value)。

关于c++ - 我不能直接在 C++ 中返回列表初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29013688/

相关文章:

c++ - 可以在基类初始化列表中传递成员对象吗?

c++ - 使用 C++11 的成员初始化列表中的初始化列表语法

c++ - 将文本文件拆分为多个文件c++

c++ - 使用模板重载运算符 ()

c++ - 访问 CXMMatrix 的 float - () 运算符不起作用

c++ - 在 C++ 中使用 Initializer 列表进行抽象类型初始化

具有两个 GLfloats 作为对的 C++11 vector 无法统一初始化

c++ - g++ 和 clang 中的构造函数、初始化列表和不同行为

c++ - 仅分析我需要使用 VS2010 的命名空间

c++ - C++中的特征库是否有动态 vector 或矩阵