C++ 为什么不';t标准随机访问迭代器实现大小的算法?

C++ 为什么不';t标准随机访问迭代器实现大小的算法?,c++,language-lawyer,C++,Language Lawyer,这几乎是一个后续行动。主要问题是这个例子 std::vector<int> v; const size_t offset = 0; v.insert(v.begin() + offset, 0); 我完全理解差异类型必须有算法,但我不理解的是,链接问题中也没有回答的是,为什么大小没有额外的运算符+ 为了摆脱这些警告,我提出了一个相当老练的解决方案,那就是亲自实施: template<class IteratorType, typename std::enable_i

这几乎是一个后续行动。主要问题是这个例子

std::vector<int> v;
const size_t offset = 0;
v.insert(v.begin() + offset, 0);
我完全理解
差异类型
必须有算法,但我不理解的是,链接问题中也没有回答的是,为什么
大小
没有额外的
运算符+

为了摆脱这些警告,我提出了一个相当老练的解决方案,那就是亲自实施:

template<class IteratorType, 
    typename std::enable_if<
        std::is_same<typename std::iterator_traits<IteratorType>::difference_type, long>::value
        && std::is_class<IteratorType>::value
    , bool>::type = true>
IteratorType operator+(const IteratorType& _iterator, const size_t _add) {
    return _iterator + typename std::iterator_traits<IteratorType>::difference_type(_add);
}
template::type=true>
迭代器类型运算符+(常量迭代器类型和迭代器,常量大小添加){
返回_iterator+typename std::iterator_traits::difference_type(_add);
}

到目前为止,我还没有遇到任何麻烦。所以我想知道为什么标准没有提供这个操作符的原因。

这在g++5.3和clang 3.8上编译时没有警告,即使使用
-Wall
@Holt,我也打开了
-Wsign conversion
,因为我认为它在其他情况下提供了有用的警告。对我来说,问题是,为什么使用size\u t而不是::difference\u type来声明偏移量。从语义上讲,偏移量是一种差异,为了类型安全性和代码可读性,应该这样声明偏移量。在我看来,size_t并不表示特定的语义含义,而且根据使用的上下文会让人感到困惑。另一个答案是:“因为算术需要正确地处理有符号的值;人们会认为它+(-1)等同于它-1。”这对您来说还不够吗?您想更改语言,因为编译器发出警告?这似乎是倒退。代码运行正常,请要求编译器停止警告。。。顺便说一句,对于有符号/无符号的语义,在标准中使用无符号类型(size_t)是一个错误。
template<class IteratorType, 
    typename std::enable_if<
        std::is_same<typename std::iterator_traits<IteratorType>::difference_type, long>::value
        && std::is_class<IteratorType>::value
    , bool>::type = true>
IteratorType operator+(const IteratorType& _iterator, const size_t _add) {
    return _iterator + typename std::iterator_traits<IteratorType>::difference_type(_add);
}