c++在存储指针元组时遇到问题

c++ having trouble storing tuple of pointers

本文关键字:遇到 问题 元组 指针 存储 c++      更新时间:2023-10-16

我有一个对象"S",它存储一个简单的指针元组,通过使用可变模板使其变得灵活。有两种方法,store()和store2()。第一家(商店)运转良好。第二个不会编译,因为std::make_tuple失败并返回错误:

'调用'make_tuple'没有匹配的函数

它进一步补充说,从"B*"到"B*&'对于第一个参数(此错误在元组库标头中很深)。

代码在这里:

#include <tuple>
#include <utility>
template<typename...Rs>
struct S
{
    void store(std::tuple<Rs*...> rs)
    {
        rs_ = rs;
    }
    void store2(Rs*...rs)
    {
        rs_ = std::make_tuple<Rs*...>(rs...); // This is the guy that breaks
    }
private:
    std::tuple<Rs*...> rs_;
};
struct B
{};
struct A : S<B, B>
{};
int main()
{
    auto *b1 = new B;
    auto *b2 = new B;
    auto *a1 = new A;
    a1->store(std::make_tuple(b1, b2));   // This works
    a1->store2(b1, b2);    // How can I get this to work?
                           // (It causes an error in std::make_tuple of store2 above)
}

这是一个错误,因为make_tuple与C++11或更高版本的make_pair一样,接受转发引用,当您显式指定非引用的模板参数时,这些转发引用将变为右值引用。

所以make_tuple<Rs*...>就是tuple<Rs*...> make_tuple(Rs*&&...)-参数类型都是右值引用,它们不绑定到左值(并且rs...扩展到左值列表)。

这些make_meow函数的全部目的是避免必须写出显式模板参数,所以……不要写它们。

我无法准确解释为什么这是一个错误(我怀疑这与强制衰减有关),但std::make_tuple不打算用显式指定的模板参数调用(在这种情况下,您可以只使用std::tuple,而是用于推导它们的时间)。

以下两个作品之一:

rs_ = std::tuple<Rs*...>(rs...);
rs_ = std::make_tuple(rs...);

似乎将其更改为std::make_tuple(rs...)可以很好地工作。。。