什么时候需要在C++中使用decltype

Sun*_*ner 7 c++

我正在学习C++,并在C++入门中找到了以下代码:

int main() {

string s("some string");
for(decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)
    s[index] = toupper(s[index]);

cout << s;
Run Code Online (Sandbox Code Playgroud)

}

我理解代码大写字符串中的第一个单词,输出是

SOME string
Run Code Online (Sandbox Code Playgroud)

我很好奇的是,为什么你需要使用decltype(s.size())声明索引的类型.如果我将其更改为int index =0,代码仍然编译并运行没有问题.我似乎更容易使用int.我想我在这里缺少一些导入概念,任何反馈都会非常有用.谢谢!

Xir*_*ema 7

不需要使用decltype(s.size())声明类型,但声明它int不一定是个好主意.或者至少这不是一个好习惯.

decltype(s.size())字面意思是"这种类型应该std::string与存储字符串长度的任何用途相同".在大多数C++实现中size_t,这将是无符号的64位整数(在大多数情况下)或无符号的32位整数.在任何一种情况下,int(有符号且可能不会是64位)都不能代表对象的整个可能的大小范围std::string,在异国情况下,这可能超过21亿个字符.在这些情况下,如果将类型定义为int,则存在未定义行为的风险.

请注意,在我的代码中,我经常只是写for(size_t index = 0; index < string.size(); index++),因为这更简单.但是如果你想保证代码在所有平台上运行,那么代码for(decltype(string.size()) index = 0; index < string.size(); index++)是最安全的版本.

  • 这不是猜测的问题。`std::string::size_type` 被明确无误地指定。 (2认同)