据我所知,std::forward<T>(x)相当于static_cast<T&&>(x).
但是从我所看到的,static_cast<T>(x)似乎做同样的事情,如下面的代码所示
我的问题是为什么不出std::forward<T>被实现为static_cast<T&&>(x),而不是static_cast<T>(x),如果两者都具有相同的效果?
我有困难之间的选择size_t和ptrdiff_t对性的指标,应该需要能够存储负值的类型.
确切地说,在我的代码中,我需要实现一个数组.我收到它的长度(在构造函数中)作为一种类型size_t,当我重载时[] operator我需要索引是类型ptrdiff_t(而不是size_t),因为我想允许负索引,如下例所示:
std::size_t length = 50;
MyVector<int> vec(length);
vec[0] = 10;
MyVector<int> vec2 = vec+1;
std::cout << vec2[-1] << std::endl; //should print 10
Run Code Online (Sandbox Code Playgroud)
所述设计产生的问题是可用指数的范围受到最大值的限制ptrdiff_t,并且在一些机器中,该上限小于最大值size_t.
即 std::numeric_limits<std::ptrdiff_t>::max() < std::numeric_limits<std::size_t>::max()
因此,问题是用户可能会创建一个大小超过最大值ptrdiff_t(size_t当然仍在其范围内)的数组ptrdiff_t,但是他无法访问数组的元素,而这些元素的成功超过了最大值,因为它们的索引会溢出到负数.在我的机器上,这将可用的索引减少了一半!(因为这两个size_t和ptrdiff_t是64位,但一个是unsigned,另一个是signed)
以下是我提出的解决方案,但遗憾的是它们都不是完美的:
在构造函数中,接受一个类型的长度ptrdiff_t而不是size_t,并添加一个检查,以验证给定的长度不是负的.
优点:它解决了这个问题,因为现在我可以访问数组中的所有元素,并且仍然允许负索引.
缺点:它限制了数组的最大可能长度.(就像我之前说过的那样,在我的机器中减少了一半)
保持原样,但在其中[] operator,将索引转换为类型size_t,并利用负值溢出的事实. …