std :: tuple和std :: tuple <std :: tuple>是否被std :: vector视为相同的类型?

ati*_*tis 16 c++ tuples

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

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

我希望drum成为元组的元组.(即((a, b, c))).

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

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

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

我还有一个定义如下的向量

std::vector<std::tuple<std::tuple< float
                                 , ExampleClass
                                 , std::function<float (ExampleClass&)>
                                 >>> listOfInstruments;
Run Code Online (Sandbox Code Playgroud)

现在,如果我添加drum,listOfInstruments我希望没有错误.

事实确实如此 listOfInstruments.push_back(drum);

我预计错误在这里,listOfInstuments.push_back(base);但代码编译得很好.

由于listOfInstruments有'元组元组',不应该只添加'元组'导致一些错误?除非双方()(())通过被认为是同一类型std::vector.或者我完全错了,还有其他工作在这里吗?

似乎无法弄明白.

Que*_*tin 32

元组和向量大多是红鲱鱼.有效的方式就是push_back像任何函数一样,可以对其参数执行隐式转换,如以下工作代码段所示:

#include <vector>

struct A { };

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

int main() {
    std::vector<B> v;
    v.push_back(A{});
}
Run Code Online (Sandbox Code Playgroud)

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

tuple( const Types&... args );
Run Code Online (Sandbox Code Playgroud)

当且仅当所有成员都具有隐式复制构造函数时,此构造函数是隐式的,这是这里的情况(因为合成的构造函数确实是隐式的).这意味着std::tuple<...>可以隐式转换为std::tuple<std::tuple<...>>您正在观察的内容.

  • @ Yakk-AdamNevraumont uuuh ...我错过了那个音符,但公平地说我不明白为什么那是我自己. (2认同)