当前位置: 首页 > 知识库问答 >
问题:

我不明白d::result_of和Dectype的用法

路阳华
2023-03-14

在我的Visual Studio项目中,我有以下几点,而且效果很好:

template <typename T>
void function(T type)
{

    std::result_of<T()>::type myVar = 5; // This compiled fine with Visual Studio, 
but with GCC it shows the following errors:
    //error: dependent-name ‘std::result_of<T()>::type’ is parsed as a non-type, 
    //but instantiation yields a type. note: say ‘typename std::result_of<T()>::type’ if a type is meant
}

int main() {

    auto lambda = []() { return float(); };
    function(lambda);
    return 0;
}

我只是想明白,编译器是否坚持我用“typename”作为d::result_of的前缀,因为它可能是模糊的,在d::result_of可以返回一个类,然后::类型可以是一个那个班的成员?这就是为什么它坚持要添加typename吗?如果是这样,那么为什么Visual Studio允许它?不合规吗?

另外,因为我已经读到了C 14或C 17的结果_被弃用,我想尝试使用更通用的decltype,它应该在更多的情况下工作。所以我试着:

template <typename T>
void function(T type)
{
decltype(T()) myVar = 5; // Error, use of deleted function‘main()::<lambda()>::<lambda>()’  main.cpp    
}

所以我知道lambda有一个被删除的默认构造函数和复制赋值操作符,但是在这种情况下,我真的认为当把lambda传递给这个模板函数时,lambda的复制构造函数被调用,它确实有。然后,当我做Decktype(T()),我假设这将调用它的运算符()函数。我不明白为什么它说什么删除功能

最后我尝试了:

decltype(std::declval<T()>) myVar = 5;

因为我认为Decval可以被用作创建一个你打的任何电话的虚假实例,至少这是它是如何向我解释的。这也失败与错误:

“初始化'main()类型的引用无效:”

共有1个答案

卢阳泽
2023-03-14

result_of

首先,GCC编译器要求关键字typenamestd::result_of之前,因为后者的返回值是一个类。你必须指示它使用它的类型来声明一个新变量。

关于你的评论:

另外,因为我已经读到,从C 14或C 17开始,结果_被弃用

std::result_of在C17中被弃用(请参阅此处原因),并被新引入的std::invoke_result所取代,因此如果您有兼容的编译器,您可以使用它。

脱模

因为std::result_of是以dectype的形式声明的:

  template<typename _Signature>
  struct result_of;

  template<typename _Functor, typename... _ArgTypes>
  struct result_of<F(Args...)> {
      typedef decltype( std::declval<F>()(std::declval<Args>()...) ) type;
  };

您可以使用类似的定义:

decltype( std::declval<T>()() ) myVar = 5;
 类似资料:
  • 我需要改变复选框检查状态,但useCallback重新呈现组件很多次。我不明白它是如何工作的。我读过很多关于它的材料。 重新渲染的数量:

  • 我正在Celero git存储库中检查DoNotOptimizeAway的含义。但我还是不明白。请你用外行的话帮我理解一下好吗。尽你所能。

  • 我对遗传的理解是相当基础的。

  • 还不起作用。所以我放弃链接,我只是编码:

  • 尽管有值,但我不能得到一个用户的值的和时间。 即使用户17有工作时间值,我也会在sumTW列中得到该用户的NULL值。我该怎么解决? 这就是我的查询看起来的样子: 下面是表格代码: (这个表和原来的不一样,原来的有外键。我去掉它们只是为了能够再现同样的问题,同样的问题被报告了)。

  • 问题内容: 我对Angular中的注入感到非常困惑。我不知道在哪里使用它以及为什么。是否仅按此处所述与工厂一起使用? 这是工厂的名称。 问题答案: 这是在代码最小化后(如果选择最小化)支持依赖注入的一种方法。 声明控制器时,该函数采用参数: 压缩代码时,您的函数将如下所示: 由于AngularJS使用函数参数名称来推断DI,因此您的代码会中断,因为AngularJS不了解或。 为了解决此问题,他们