std :: string insert方法有多么模糊的重载?

时间:2010-05-12 14:15:51

标签: c++ stl stlport

环境:VS2005 C ++使用STLPort 5.1.4。

编译以下代码段:

std::string copied = "asdf";
char ch = 's';
copied.insert(0,1,ch);

我收到错误:

Error   1   error C2668: 'stlpx_std::basic_string<_CharT,_Traits,_Alloc>::insert' : ambiguous call to overloaded function   

看来问题是对字符串对象的insert方法调用。

两个定义的重载是

void insert ( iterator p, size_t n, char c );
string& insert ( size_t pos1, size_t n, char c );

但是鉴于STLPort使用一个简单的char *作为迭代器,我的代码中insert方法的字面值为零。

因此,虽然我可以通过提示轻松解决问题,例如

copied.insert(size_t(0),1,ch);

我的问题是:规范中是否存在这种重载和可能含糊不清的问题?或者更有可能是特定STLPort实现的意外副作用?

(请注意,Microsoft提供的STL没有此问题,因为它有一个迭代器类,而不是裸指针)

3 个答案:

答案 0 :(得分:1)

已知问题,被裁定为“不是缺陷”。 http://std.dkuug.dk/jtc1/sc22/wg21/docs/lwg-closed.html#84

答案 1 :(得分:0)

如果区分不同的整数类型,则根本没有歧义

良好做法命令用于在size_t(或ssize_t)类型中存储缓冲区大小,而不是int

如果您同意这一点,那么调用insert(int, int, char)是没有意义的,因为这两个第一个参数应该是“缓冲区大小”。

如果没有从intsize_t的隐式转换,您甚至无法以这种方式致电insert()

答案 2 :(得分:0)

有意或无意,问题与0的语义有关,而不是与所讨论的成员函数有关。也许微软图书馆的设计师(他们上次我检查过他们使用的Dinkumware)在这方面更加谨慎。