【发布时间】:2021-04-21 11:01:09
【问题描述】:
这是某种工厂 lambda。由 lambda 实例化的类在其构造函数中接收对另一个类的引用。如果后者声明了一个 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++ 主干
有什么想法吗?
谢谢
【问题讨论】:
-
错误是:
no matching function for call to 'std::tuple<const char*, A>::tuple(const char [3], A&) -
registerType<B>("lala", "p1", std::move(a))();godbolt.org/z/W88hTrT48