在学习变参函数模板的时候,运行如下代码时,出现了段错误: tem.h
#ifndef TEM_H
#define TEM_H
#include <set>
#include <memory>
#include <iostream>
class Base {};
class Derive1 : public Base {};
class Derive2 : public Base {};
class Derive3 : public Base {};
class Mng {
public:
static Mng *GetInst()
{
static Mng instance;
return &instance;
}
void RegLoad(std::unique_ptr<Base> &&ptr)
{
std::cout << "regload" << std::endl;
mem_.insert(std::move(ptr));
}
void RegLoad() {}
template <typename T, typename... Args>
void RegLoad(T &&t, Args&&... args)
{
RegLoad(std::forward<T>(t));
RegLoad(std::forward<Args>(args)...);
}
uint32_t Size()
{
return mem_.size();
}
private:
Mng() = default;
std::set<std::unique_ptr<Base>> mem_;
};
#endif
test.cpp
#include "tem.h"
int main()
{
Mng::GetInst()->RegLoad(std::make_unique<Derive1>(), std::make_unique<Derive2>(),
std::make_unique<Derive3>());
std::cout << Mng::GetInst()->Size() << std::endl;
return 0;
}
在这里,实际给mem_ 赋值的接口也被定义成了RegLoad ,编译器可能总是匹配到变参模板函数的RegLoad ,而导致行为不符合预期。
修改一下RegLoad 的定义即可:
void RegLoad() {}
template <typename T, typename... Args>
void RegLoad(T &&t, Args&&... args)
{
mem_.insert(std::move(t));
RegLoad(std::forward<Args>(args)...);
}
那为什么错误的那版代码会报Segmentation Fault:11 错误呢?
|