为什么std::string没有标准定义的字面量后缀?

11

一个简短的问题:为什么C++11没有提供一个“用户定义的字面量”(实际上是标准库),用于创建std::string,例如:

auto str = "hello world"s; // str is a std::string

像C++一样,Objective-C支持C风格的字符串和更加用户友好的库类型NSString;然而,与C++不同的是,没有人会因为在字符串字面值前加上@标记就能创建NSString而感到困惑。实际上,在Objective-C代码中很少看到没有@前缀的字面量。每个人都知道这是正确的做法,使用NSString并继续工作。

C ++ 11用户定义的文字可以允许此操作,事实上Stroustrup的C ++ 11 FAQ上的UDL部分正是使用了这个例子。此外,没有前导下划线的UDL被保留,因此允许像上面那样的纯s不会有任何问题-它不可能与其他任何内容冲突。

也许我错过了什么,但似乎这将是一项非常有价值且无风险的语言增强功能,所以是否有人知道为什么C ++ 11不提供它? 它可能出现在C ++ 14中吗?

1个回答

21

用户定义字面值在C++11中还很新,所以这不包括在内,但在C++14中有(在§21.7中,如果有人关心的话)。是的,它使用s作为后缀。精确的结果类型取决于字符串字面值本身的类型-“窄”字面值给出std::string,u16字面值给出u16string,u32字面值给出u32string。哦,对了,如果你坚持使用宽字符串字面值,它会产生wstring

请注意,s后缀也用于表示秒(在<chrono>中定义),但两者之间没有真正的冲突——字符串字面值上的s表示字符串,数字上的s表示秒。


2
好的,我们完成了,在几秒钟内得到了一个完美的答案,+1(如果可以的话还有更多)。奇怪的是它不是原始UDL提案的一部分,但是我们做到了。我期待着在C++14中终于(希望如此)摆脱char*的诅咒! - Tristan Brindle
我很想使用这个,尤其是与 auto 结合使用。 - Excelcius
3
auto 相比,更重要的是在表达式中使用,例如将字符串相加:"A"s + "B"s。这至少是我的观点。 - Jerry Coffin
@JerryCoffin:在我看来,你好像正在添加A和B :p - Matthieu M.
@MatthieuM:所以我是(或至少是A和B)。 - Jerry Coffin

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