Xcode C++开发,需要澄清

6

我非常喜欢Xcode提供的语言可能可用成员函数的洞察力,并且如果不是因为我今天注意到的一个怪异现象,我宁愿使用它而不是文本编辑器。

string s = "Test string";时,唯一可用的substr签名如下所示:

enter image description here

然而,从我所了解的和在网上看到的,签名应该是:

string substr ( size_t pos = 0, size_t n = npos ) const;

实际上,在Xcode中,s.substr(1,2)是被理解并且可以正常工作的。

但为什么我在尝试使用方法自动完成(Ctrl-Space)时它没有显示出来呢?


我相当确定目前你能做的最好的就是提交一个错误报告。 - zneak
1个回答

15
Xcode 正确地执行了自动补全,但不是您所期望的。您其实无意中已经回答了这个问题。正如您所说,stringsubstr() 方法的函数签名是:
string substr ( size_t pos = 0, size_t n = npos ) const;

所有传递给 substr() 的参数都有默认值,因此对于 Xcode 来说,s.substr()(没有参数)是有效的代码补全插入,因为它实际上等同于 s.substr(0, s.npos)。你可以通过任何数量的标准 C++ 函数与默认参数来确认这一点。最容易看到这一点的地方是任何 STL 容器构造函数中。
vector 为例。我们都知道 vectors 可以使用 Allocator,但是分配给 Allocator 的默认参数对于大多数普通用途已经足够了。确实,vector 构造函数的两个签名如下:
explicit vector ( const Allocator& = Allocator() );
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

在这两种情况下,Allocator参数都有默认赋值,在第二种情况下,T默认值也有默认赋值。现在,看一下Xcode在构造vector时建议了什么:

Xcode 4.2.1 Code Completions for vector constructor

没有参数列表的建议实际上是只接受一个Allocator的构造函数。只接受size_type的建议实际上是接受一个size_type、T和Allocator的构造函数。根据您的想法,这可能是Xcode的错误,也可能不是。理想情况下,您希望看到简单函数(如substr())的默认参数完成,但对于STL容器构造函数,您几乎永远不希望看到它们。也许可以提供一个选项,但我不希望看到这个被纠正。不过,我很乐意与您一起提交radar。

根据您可能喜欢的行为,这可能是错误或特性。 - Jeshua Lacock
1
@krynr,鉴于这是一个完全有效的完成,这不是一个错误。然而,更清晰的用户界面可能是需要的。自动完成为0,s.npos可能是一个可行的选择,但在某些情况下可能不太理想(例如,您实际上是在说“使用默认值”,但自动完成会将其硬编码到编码时的默认值中,这可能不是理想的)。 - James
@James:你是在告诉我苹果做不到更好吗? - znkr
这不是做得更好的问题,而是添加另一个偏好的问题。我猜使用Xcode的95%的人都是用它进行Objective-C开发的。对于只有一小部分使用C++开发并因此受到不便的人来说,这可能不值得编写代码、投入人力或添加额外的偏好设置。 - greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接