- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我设置了一个测试用例来学习完美转发。
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::forward
与 MyForward
在外部给出完全相同的结果!这种行为引出了为什么要使用身份的问题?
编译器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/
我正在研究 http://www.qxl.dk/我遇到了问题。如果将最左边的列和中间列之间的间距与中间列和最右边的列之间的间距进行比较,您会发现它们至少相差 10 个像素。 间距是通过使用 10px
我正在寻找一种技术,它不像我见过的大多数技术那样令人讨厌,它会暂时引起人们对一小段通知的注意。 我一直在笨手笨脚地添加和删除类和包装器 div,到目前为止没有取得太大成功。 感谢建议。 最佳答案 我使
我是一名优秀的程序员,十分优秀!