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
的复制构造函数显式的话,它会失败。因此,如果其成员的任何副本构造函数是显式的,则该构造函数是显式的。