gpt4 book ai didi

c++ - 尝试使用 std::result_of 时出现编译错误

转载 作者:行者123 更新时间:2023-11-30 03:33:22 27 4
gpt4 key购买 nike

我想推断作为模板参数出现的函数的返回类型。考虑以下代码:

#include <type_traits>

struct Result {};

Result foo() { return Result{}; }

template<typename Factory>
void check(Factory) {
using ActualResult = typename std::result_of<Factory()>::type;
static_assert(std::is_same<Result, ActualResult>::value, "");
}

int main() {
check(foo);
}

这按预期工作。但是,如果我将 check() 的参数更改为 const Factory&,则它不会编译。 gcc 的错误是:

prog.cc: In instantiation of 'void check(const Factory&) [with Factory = Result()]':
prog.cc:14:14: required from here
prog.cc:9:66: error: function returning a function
using ActualResult = typename std::result_of<Factory()>::type;
^
prog.cc:10:65: error: function returning a function
static_assert(std::is_same<Result, ActualResult>::value, "");
^

这里有什么问题?我怎样才能让它发挥作用?

最佳答案

函数(就像数组一样)既不能作为纯右值参数传递,也不能作为纯右值返回。

因此,template <typename Factory> void check(Factory) ,采用纯右值参数,将导致 foo衰减到函数指针,和check(foo)会导致Factory推导为Result (*)() .最后,result_of<Factory()>给出调用不带参数的函数指针的可调用类型的结果。

当你改变checkcheck(const Factory&) ,该函数采用左值,因此没有衰减,并且 Factory被推导为函数类型 Result() .这不是您可以传递给 result_of 的类型*,这需要可调用类型或对函数的引用。也就是说,您应该使用 result_of<Factory&()>在那种情况下。

*) 在 C++11 中。 result_of 的规则可能在以后的修订中放宽了,C++17 弃用了 result_of .

关于c++ - 尝试使用 std::result_of 时出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43018646/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com