【发布时间】:2020-10-10 07:17:44
【问题描述】:
为什么这些断言适用于以下代码?通用引用应该绑定到左值引用run(T& a),并从a 复制一个对象b。但是,run() 函数中的两个对象地址“a”和“b”是相同的。使用 C++11/14/17/2a gcc-9.2 和 clang++-6.0 测试。标准的哪一部分说这是有效的?没有找到任何相关的东西。
#include <cassert>
#include <utility>
template <typename T>
void run(T&& a)
{
T b {std::forward<T>(a)};
++b;
assert(b == a);
assert(&a == &b);
}
int main()
{
int value {10};
run(value); // asserts work, not expected
// run(std::move(value)); // the asserts don't work as expected
}
【问题讨论】:
-
看到这个link,帮了我很多
-
有很好的例子,谢谢分享。
标签: c++ c++11 move-semantics lvalue forwarding-reference