C++ 是std::tuple和std::tuple<;std::tuple>;std::vector认为是同一类型?
我有一个这样定义的变量C++ 是std::tuple和std::tuple<;std::tuple>;std::vector认为是同一类型?,c++,tuples,C++,Tuples,我有一个这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , ExampleClass , [](ExampleClass& instance) {return instance.eGetter ();} ) ); auto base = std::make_tuple ( 0
auto drum = std::make_tuple
( std::make_tuple
( 0.3f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
)
);
auto base = std::make_tuple
( 0.48f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
);
我希望drum
是一个元组中的元组。(即((a,b,c))
)
我有另一个定义如下的变量
auto drum = std::make_tuple
( std::make_tuple
( 0.3f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
)
);
auto base = std::make_tuple
( 0.48f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
);
我希望它只是三个元素的元组(即(a,b,c)
)
我还有一个向量定义如下
std::vector<std::tuple<std::tuple< float
, ExampleClass
, std::function<float (ExampleClass&)>
>>> listOfInstruments;
std::vector>仪器清单;
现在,如果我将鼓
添加到仪器列表
中,我希望不会出现错误
这确实是仪器列表的情况代码>
我预期会出现错误的地方是这里的listofInstruments.push_back(base)代码>但是代码编译得很好
既然listOfInstruments
的类型是“tuple of tuple”,那么仅仅添加“tuple”不应该导致一些错误吗?除非()
和(())
被std::vector
视为相同的类型。还是我完全错了,这里还有别的事情在起作用
似乎无法理解。元组和向量在这里主要是转移注意力。工作方式很简单,就是像任何函数一样,push_back
,可以对其参数执行隐式转换,如下工作代码段所示:
#include <vector>
struct A { };
struct B {
B(A const &) { }
};
int main() {
std::vector<B> v;
v.push_back(A{});
}
当且仅当所有成员都具有隐式复制构造函数时,此构造函数是隐式的,这里就是这种情况(因为合成的构造函数确实是隐式的)。这意味着std::tuple
可以隐式转换为std::tuple
,这就是您所观察到的。另外,我强烈建议您不要声明一个元素的std::tuple
,而是使用元素类型。该构造函数是“条件显式的”;你可能想解释为什么在这个例子中它是隐含的。@Yakk AdamNevraumont Uuh。。。我没有注意到这一点,但公平地说,我不明白为什么是我自己。也许链接到关于条件显式构造函数是有帮助的。@DanielJour这就是实现这样一个构造函数的方法,但是我不知道什么类型可能会失败std::is_convertible
,以及为什么在这种情况下构造函数显式是有意义的…@Quentin我相信如果Ti
的复制构造函数显式的话,它会失败。因此,如果其成员的任何副本构造函数是显式的,则该构造函数是显式的。