gpt4 book ai didi

c++ - std::tuple 和 std::tuple 是否被 std::vector 视为同一类型?

转载 作者:IT老高 更新时间:2023-10-28 22:17:42 31 4
gpt4 key购买 nike

我有一个像这样定义的变量

auto drum = std::make_tuple
( std::make_tuple
( 0.3f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
)
);

我希望 drum 是一个元组的元组。 (即((a,b,c)))。

我还有一个像这样定义的变量

auto base = std::make_tuple
( 0.48f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
);

我希望它只是三个元素的元组(即 (a, b, c))

我还有一个 vector 定义如下

std::vector<std::tuple<std::tuple< float
, ExampleClass
, std::function<float (ExampleClass&)>
>>> listOfInstruments;

现在,如果我将 drum 添加到 listOfInstruments 我预计不会出错。

listOfInstruments.push_back(drum);

确实是这种情况

我预计会出现错误 listOfInstuments.push_back(base); 但代码编译得很好。

由于 listOfInstruments 的类型为“元组的元组”,不应该只添加“元组”会导致一些错误吗?除非 ()(()) 都被 std::vector 视为相同的类型。还是我完全错了,这里还有其他事情在起作用?

似乎无法弄清楚。

最佳答案

元组和 vector 在这里大多是红鲱鱼。工作方式很简单push_back与任何函数一样,可以对其参数执行隐式转换,如下面的工作片段所示:

#include <vector>

struct A { };

struct B {
B(A const &) { }
};

int main() {
std::vector<B> v;
v.push_back(A{});
}

回到元组,我们可以看到它(除其他外)有一个条件显式构造函数 (#2 here),它引用元组的 future 成员:

tuple( const Types&... args );

当且仅当所有成员都具有隐式复制构造函数时,此构造函数才是隐式的,这里就是这种情况(因为合成构造函数确实是隐式的)。这意味着 std::tuple<...>可隐式转换为 std::tuple<std::tuple<...>> ,这就是你所观察到的。

关于c++ - std::tuple 和 std::tuple<std::tuple> 是否被 std::vector 视为同一类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54306241/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com