【发布时间】:2018-03-10 20:24:23
【问题描述】:
我正在尝试使用 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 有这个向量push_back 的例子,看起来很相似(从我的角度来看)。
template<typename T, typename... Args>
void push_back_vec(std::vector<T>& v, Args&&... args)
{
(v.push_back(args), ...);
}
是否可以使用折叠表达式创建一个普通(pod)类型的对象?如果是这样,来自未打包的元组?
【问题讨论】:
-
记住折叠表达式仍然是一个表达式。
y由第二个表达式初始化,你有一个。
标签: c++ constructor tuples c++17 fold