c++ - 使用折叠表达式构造平凡对象

标签 c++ constructor tuples c++17 fold

我正在尝试使用 std::apply 和折叠表达式构造一个对象。据我所知在线阅读文档,折叠逗号应该有效。这里有一个例子来说明。

struct my_pair final {
    float x;
    float y;
};

struct test final {
    my_pair back() {
        return std::apply(
                [](auto&... vector) {
                    return my_pair{ (vector.back(), ...) }; },
                data);
    }

    std::tuple<std::vector<float>, std::vector<float>> data
            = { { 0.f }, { 1.f } };
};

我解压元组,获取最后的元素并尝试使用这些元素返回一个新对象。

各种编译器提示 y 从未被初始化。不知何故扩张没有发生。至少,不是我所期望的那样。

error: missing field
      'y' initializer [-Werror,-Wmissing-field-initializers]
  ...[](auto&... vector) { return my_pair{ (vector.back(), ...) }; },
                                                                ^

如果我禁用 -Werror,my_pair 的第一个值为 1,第二个为 0。我尝试使用一元左折叠,但结果相同。

这似乎应该可行,cppreference 有这个 vector push_back 示例,它看起来很相似(从我的角度来看)。

template<typename T, typename... Args>
void push_back_vec(std::vector<T>& v, Args&&... args)
{
    (v.push_back(args), ...);
}

是否可以使用折叠表达式创建一个普通(pod)类型的对象?如果是这样,来自未打包的元组?

最佳答案

这里不需要折叠表达式。正确的代码是:

[](auto&... vector) 
{
    return my_pair{vector.back()...}; 
}

对于您现有的代码,这是发生的扩展:

return my_pair{ (0.f, 1.f) }

如果使用 (0.f, 1.f) 初始化,则第一个元素的计算结果为 1.f。在这种情况下,逗号标记是一个逗号运算符 - 它不会在聚合初始化期间分隔参数。

关于c++ - 使用折叠表达式构造平凡对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49213670/

相关文章:

c++ - 如何在 ffmpeg 中使用硬件加速

c# - 没有无参数构造函数的对象作为类的属性

C++只调用一个构造函数

python - 如何忽略元组中元素的顺序

python - 忽略python多重返回值

c++ - 类似于 "if constexpr"但用于类定义

c++ - Internet Explorer BHO,写入注册表和管理员权限

Javascript 构造函数行为

c++ - 在 C++17/20 中迭代元组

c++ - 是否可以根据类模板的参数来调用类方法和全局方法?