【发布时间】:2016-08-25 13:37:07
【问题描述】:
我想传递一个非捕获 lambda,它返回一个
std::unique_ptr<Derived>,作为std::unique_ptr<Base>(*)()类型的函数指针。
但是,这仅在我将 lambda 的返回类型明确声明为 std::unique_ptr<Base> 时才有效。
- 为什么我要明确声明返回类型?
- 为什么它适用于没有这种额外返回类型的
std::function?
#include <functional>
#include <memory>
struct Base{virtual ~Base()=default;};
struct Derived : Base{};
struct FailsForF2
{
using Function = std::add_pointer_t<std::unique_ptr<Base>()>;
FailsForF2(Function f) {}
};
struct Works
{
using Function = std::function<std::unique_ptr<Base>()>;
Works(Function f) {}
};
std::unique_ptr<Derived> fun() {return std::make_unique<Derived>();}
int main()
{
auto f1 = [](){return std::make_unique<Base>();};
auto f2 = [](){return std::make_unique<Derived>();};
auto f3 = []()->std::unique_ptr<Base>{return std::make_unique<Derived>();};
Works x1(f1);
Works x2(f2);
Works x3(f3);
FailsForF2 x4(f1);
FailsForF2 x5(f2);
FailsForF2 x6(f3);
}
gcc 错误:
main.cpp: In function 'int main()':
main.cpp:34:20: error: invalid user-defined conversion from 'main()::<lambda()>' to 'FailsForF2::Function {aka std::unique_ptr<Base> (*)()}' [-fpermissive]
FailsForF2 x5(f2);
^
main.cpp:26:17: note: candidate is: main()::<lambda()>::operator std::_MakeUniq<Derived>::__single_object (*)()() const <near match>
auto f2 = [](){return std::make_unique<Derived>();};
^
main.cpp:26:17: note: no known conversion from 'std::_MakeUniq<Derived>::__single_object (*)() {aka std::unique_ptr<Derived> (*)()}' to 'FailsForF2::Function {aka std::unique_ptr<Base> (*)()}'
main.cpp:10:4: note: initializing argument 1 of 'FailsForF2::FailsForF2(FailsForF2::Function)'
FailsForF2(Function f) {}
【问题讨论】:
-
std::add_pointer_t<std::unique_ptr<Base>>;不会是指向unique_ptr<base>的指针吗?请参阅coliru.stacked-crooked.com/a/5a1c461bfb6199a8 我可能不是这里的专家,但我可以猜想编译器在将unique_ptr<derrived>转换为指向unique_ptr<base>的指针时遇到问题,同时将unique_ptr<base>转换为指向unique_ptr<base>的指针它可以以某种方式隐式执行 -
@Hayt 我使用
std::add_pointer_t<std::unique_ptr<Base>()>;,请注意末尾的( ) -
啊,是的。那没关系。它可能必须对函数 ptr (第一个是)和带有一些转换的函数对象的不同行为做一些事情,但我现在找不到任何链接(与 lambdas 组合。可能也可以将 lambda 转换为 c 函数 ptr)。
标签: c++ lambda function-pointers c++14