起源是群里有人问
auto isVowel = [vowels = "aeiouAEIOU"s](char ch) 这个s什么意思呀
想了想应该是 c++11 之后的 operator""s
后来看了源码发现是这样
inline namespace literals
{
inline namespace string_literals
{
inline _LIBCPP_INLINE_VISIBILITY
basic_string<char> operator "" s( const char *__str, size_t __len )
{
return basic_string<char> (__str, __len);
}
}
}
发现这函数签名和实际调用参数个数不对的,于是查看了汇编码
如下图
编译期确实帮助传了__len 这个参数
自己自定义了一个类似函数,发现也是可用的
string operator""_sm(const char* s, unsigned long len) {
cout << len << endl;
return string(s);
}
int main() {
string s = "abc"_sm;
cout << s << endl;
}
后来查看en.cppreference.com
https://en.cppreference.com/w/cpp/language/user_literal
发现了下面的文字
意思是"abc"_sm 会被视为 operator""_sm(“abc”, 3); 这个 len 字段会自动被算出来
所以有趣的事就来了, 编译期计算字符串字面量的长度
int operator"" _len(const char* s, unsigned long len) {
return len;
}
int main() {
int len = "abc"_len;
cout << len;