5

环境: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   

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

两个定义的重载是

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 实现的意外副作用?

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

4

3 回答 3

1

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

于 2010-05-12T14:21:57.717 回答
0

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

size_t将缓冲区大小存储为(或ssize_t)类型的良好实践命令,而不是int.

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

如果没有从intto 的隐式转换size_t,你甚至不能这样调用insert()

于 2010-05-12T14:21:05.970 回答
0

有意与否,问题与所讨论0的成员函数的语义有关。也许微软库的设计者(我上次检查时他们使用了 Dinkumware)在这方面更加谨慎。

于 2010-05-12T14:21:08.333 回答