【问题标题】:Does it make sense to use std::forward with the typeid operator?将 std::forward 与 typeid 运算符一起使用是否有意义?
【发布时间】:2014-11-20 10:30:33
【问题描述】:

我想知道在向typeid 提交实例时使用std::forward<> 是否有意义?

template <typename T>
void foo(T&& value) {
  std::cout << typeid(std::forward<T>(value)).name() << std::endl;
}

调用typeid(value) 会产生相同的结果吗?

【问题讨论】:

  • 为什么有意义?你为什么不试着编译它?
  • @JonathanWakely 仅编译表明,在许多情况下,使用std::forward 会得到与不使用相同的结果,但不能用来最终证明它在所有情况下都会给出相同的结果。
  • 所以你写了一个像上面那样的函数模板,然后给它扔了一堆类型。一些内置类型、一个重要的类类型、一个指针等,你可以得到很好的想法。第一个问题仍然存在,为什么它有意义? typeid 不是函数,它不会复制其操作数。此外,当 forward 不存在时,它存在于 C++03 中,因此显然不需要 forward 来使其给出正确答案
  • @JonathanWakely 我实际上想了一会儿,可能有一个细微的差别,其中一个用途返回 value 的静态类型,而另一个返回它的动态类型。没有,但如果有,那将是您未在要测试的事物中列出的内容。 :) 我同意一些基本测试的结果可能已经(并且可能应该已经)包含在问题中。
  • @piwi value 的静态类型与 std::forward&lt;T&gt;(value) 的静态类型相同:即 T 去除了任何引用限定符。 value 的动态类型也与std::forward&lt;T&gt;(value) 的动态类型相同:两个表达式引用同一个对象。尽管T 可以具有引用限定符,但表达式的类型从不 引用。它可以是左值、xvalue 或 prvalue,但这不被视为表达式类型的一部分。

标签: c++ c++11 rtti perfect-forwarding


【解决方案1】:

来自[expr.typeid]/3:

typeid 应用于除多态类类型的泛左值之外的表达式时,结果引用代表表达式静态类型的std::type_info 对象。

在 C++ 标准中,“表达式的类型”绝不是引用类型;表达式的“引用性”(左值或右值引用)在其值类别中表示。由于std::forward不修改表达式的类型,只修改它的值类别(例如从左值到右值),应用std::forward不会影响typeid的结果。

【讨论】:

    【解决方案2】:

    不,它没有。无论哪种方式,结果都是一样的。

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 2021-08-29
      • 2011-04-12
      • 2020-06-01
      • 2020-04-04
      • 2012-08-16
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多