我的问题包含两个部分:
功能
static_cast<Т>(arg)
会改变内部结构arg
吗?显然不是,根据这样的代码:float i1 = 11.5; int x = static_cast<int>(i1); std::cout << i1<<std::endl; //11.5 std::cout << x<<std::endl; //11
为什么这样的代码:
std::string s1 = "123"; std::string s2 = std::move(s1); std::cout << s1 << std::endl; //empty std::cout << s2 << std::endl; //123
其中
std::move()
仅使用 astatic_cast
到 r 值:template<typename _Tp> constexpr typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) noexcept { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
生成一个
s1
空字符串?
我猜,这是因为使用了string after的move 构造函数s2 =
。它必须通过等于nullptr
或 0 字符串对象中的所有数据来擦除初始字符串。虽然std::move()
它本身只返回右值。这是正确的吗?
我知道我的问题是static_cast 到 r-value 引用和 std::move 在初始化中更改其参数的重复,但我还没有找到明确的解释。