在 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

这至少发生在:

有什么想法吗?

谢谢

您无法复制 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