gpt4 book ai didi

c++11:std::forward 的微妙之处:身份真的有必要吗?

转载 作者:IT老高 更新时间:2023-10-28 23:17:32 26 4
gpt4 key购买 nike

我设置了一个测试用例来学习完美转发。

std::string inner(const std::string& str ) {
return "const std::string&";
}
std::string inner(std::string& str ) {
return "std::string&";
}
std::string inner(const std::string&& str ) {
return "const std::string&&";
}
std::string inner(std::string&& str ) {
return "std::string&&";
}

template <typename T> void outer(T&& t) {
std::cout << "t: " << t << std::endl;
std::cout << "perfect forward: " << inner(std::forward<T>(t)) << std::endl;
std::cout << std::endl;
}

void PerfectForwarding()
{
outer("literal");
outer(lvalue);
outer(constlvalue);
outer(rvalue());
outer(constrvalue());
}

std::forward按预期工作。当我实现自己的没有身份的转发函数时,会出现有趣的行为:

template <typename T> T&& MyForward(T& t)
{
return ((T&&)t);
}

替换 std::forwardMyForward在外部给出完全相同的结果!这种行为引出了为什么要使用身份的问题?

编译器VS2010

更新 1:关于防止类型推断

AFAIK,特殊类型扣除规则仅在 T&& 上激活。注意转发的定义,forward(typename identity<T>::type& t) .参数类型只有一个 &。事实上,在我将 MyForward 更改为使用身份并省略 (T&&) 强制转换后,该示例无法编译。从表面上看,从左值到右值的转换似乎使正向工作。

更新 2:在 ideone.com 上使用 GCC 4.5 进行测试,行为相同。

最佳答案

remove_reference<T> ( identity 是旧版本的草稿,但已更改为 remove_reference )用于防止类型推断:std::forward only 适用于显式类型参数。否则将编译以下内容:

std::forward(t)

...但它不会做正确的事情。

关于左值/右值的问题,请注意有 two overloads of std::forward : 一个用于左值,另一个用于右值。

事实上,MyForward给出的实现更像 std::move :它将左值转换为右值(不同之处在于 move 也接受右值)。

关于c++11:std::forward 的微妙之处:身份真的有必要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10286214/

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