NO,这并不总是正确的。然而,它比乍一看要复杂一些:
首先,让我们看看是什么std::string
是(21.3/1):
标题<string>
定义了basic_string
用于操作不同长度序列的类模板
类似 char 的对象和四个 typedef,string
, u16string
, u32string
, and wstring
,即专业名称basic_string<char>
, basic_string<char16_t>
, basic_string<char32_t>
, and basic_string<wchar_t>
, 分别。
从 21.4/5 开始:
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string {
typedef typename allocator_traits<Allocator>::size_type size_type;
static const size_type npos = -1;
// [other members omitted]
};
请注意,虽然npos
初始化为-1
,其类型取决于Allocator::size_type
,这意味着在没有进一步知识的情况下,我们不能简单地假设string::npos == -1
甚至会编译。
Now, as string
使用默认分配器(毕竟模板参数在标准库提供的 typedef 中具有默认值),让我们检查 20.6.9:
typedef size_t size_type;
现在,我们基本上可以将问题重写为:size_t(-1) == -1
。现在发生的情况取决于子表达式的类型:左侧显然有类型size_t
,而右侧是一个整数文字,其类型为int
,当这样写时(没有进一步的限定符)。
结果是true
if size_t
至少与int
(对于标准狂热者:具有更大或等于 4.13 中定义的整数转换等级)。否则,左手边将晋升为int
,引起像这样的比较0xFFFF == -1
(for size_t
being uint16_t
and int
具有 32 位),即false
.
请注意,虽然 16 位系统本身已经不再常见(除了一些外形非常小的残余物),int
标准不限制为 32 位。一个针对 x86_64 的编译器64
bit size_t
和 128 位int
在技术上是合规的。
所有引用均来自 C++11 标准 (ISO/IEC 14882:2011)。