在 class 中声明 unique_ptr 成员时出现编译错误
Compilation error declaring a unique_ptr member in a class
这是某种工厂 lambda。要由 lambda 实例化的 class 在其构造函数中接收对另一个 class 的引用。如果后者声明了一个 unique_ptr 成员,则会抛出一个很长的错误:
#include <memory>
#include <string>
struct A
{
std::unique_ptr<int> foo;
};
struct B
{
B(const std::string & str, A&a) {}
};
template<typename T, typename ... Args>
auto registerType(const std::string & type, Args&& ... args)
{
return [args = std::make_tuple(std::forward<Args>(args) ...)]() mutable -> auto
{
return std::apply([](auto&& ... args){
return std::make_unique<T>(args ...);
}, std::move(args));
};
}
int main()
{
A a;
registerType<B>("lala", "p1", a)();
}
删除 unique_ptr 成员效果很好。
将指针传递给 'a' 而不是引用也可以正常工作。
错误输出很长,最好实际查看一下:
https://godbolt.org/z/n896qMz59
这至少发生在:
- g++ 9.2.0 和主干
- clang++ trunk
有什么想法吗?
谢谢
您无法复制 unique_ptr
。
但是你可以移动它:
#include <utility>
// ...
registerType<B>("lala", "p1", std::move(a))();
或者在使用make_tuple
时防止std::decay
发生:
return [args = std::tuple<Args...>(std::forward<Args>(args) ...)]() mutable -> auto
这是某种工厂 lambda。要由 lambda 实例化的 class 在其构造函数中接收对另一个 class 的引用。如果后者声明了一个 unique_ptr 成员,则会抛出一个很长的错误:
#include <memory>
#include <string>
struct A
{
std::unique_ptr<int> foo;
};
struct B
{
B(const std::string & str, A&a) {}
};
template<typename T, typename ... Args>
auto registerType(const std::string & type, Args&& ... args)
{
return [args = std::make_tuple(std::forward<Args>(args) ...)]() mutable -> auto
{
return std::apply([](auto&& ... args){
return std::make_unique<T>(args ...);
}, std::move(args));
};
}
int main()
{
A a;
registerType<B>("lala", "p1", a)();
}
删除 unique_ptr 成员效果很好。 将指针传递给 'a' 而不是引用也可以正常工作。
错误输出很长,最好实际查看一下:
https://godbolt.org/z/n896qMz59
这至少发生在:
- g++ 9.2.0 和主干
- clang++ trunk
有什么想法吗?
谢谢
您无法复制 unique_ptr
。
但是你可以移动它:
#include <utility>
// ...
registerType<B>("lala", "p1", std::move(a))();
或者在使用make_tuple
时防止std::decay
发生:
return [args = std::tuple<Args...>(std::forward<Args>(args) ...)]() mutable -> auto