std :: tuple存储的垃圾值

时间:2016-11-24 20:01:56

标签: c++

我正在尝试实现Variadic模板。但是我面临一个奇怪的问题,我很长时间都无法解决这个问题。

下面是示例代码(正在重现同样的问题):

#include<iostream>
#include<tuple>

template<typename... Args> struct Print_Helper
{
        const std::tuple<const Args&...>& argTuple;

        Print_Helper(const std::tuple<const Args&...>& argTuple)
                :argTuple(argTuple)
        {

        }
};


        template<typename fmtType,typename...Args> Print_Helper<const Args&...>
Print(fmtType fmt,const Args&... args)
{
        Print_Helper<const Args&...> ipH(std::tuple<const Args&...>(args...));
        return ipH;
}

template<typename... Args>
void otherFunc(Print_Helper<const Args&...> obj)
{
        std::cout<<std::get<0>(obj.argTuple)<<"\n";
}

int main()
{

        auto obj = Print("i=%", 1234);
        std::cout<<std::get<0>(obj.argTuple)<<"\n";
        otherFunc(obj);

}

问题在于main()函数在我尝试打印元组的第一个元素时,它被正确打印。但是,当我尝试传递对象(存储元组时)并尝试检索第一个参数的值时,它会给我垃圾。

请帮忙。我试图从很长一段时间来理解这个问题,但没有得到确切的问题。

感谢。

1 个答案:

答案 0 :(得分:3)

你有悬挂引用,因为你的成员是一个const引用,你提供了一个临时的:

Print_Helper<const Args&...> ipH(std::tuple<const Args&...>(args...));
//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                                 Temporary
// From now, ipH.argTuple is dangling.