我正在尝试实现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()
函数在我尝试打印元组的第一个元素时,它被正确打印。但是,当我尝试传递对象(存储元组时)并尝试检索第一个参数的值时,它会给我垃圾。
请帮忙。我试图从很长一段时间来理解这个问题,但没有得到确切的问题。
感谢。
答案 0 :(得分:3)
你有悬挂引用,因为你的成员是一个const引用,你提供了一个临时的:
Print_Helper<const Args&...> ipH(std::tuple<const Args&...>(args...));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Temporary
// From now, ipH.argTuple is dangling.