【发布时间】: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<T>(value)的静态类型相同:即T去除了任何引用限定符。value的动态类型也与std::forward<T>(value)的动态类型相同:两个表达式引用同一个对象。尽管T可以具有引用限定符,但表达式的类型从不 引用。它可以是左值、xvalue 或 prvalue,但这不被视为表达式类型的一部分。
标签: c++ c++11 rtti perfect-forwarding