一、未求值字符串
Non-evaluated Strings,未评估字符串或未求值字符串。搞了半天不明白什么意思,一个字符串怎么还需要求值。后来看文档说明才发现,所谓未求值的意思其实是指在编译器处理字符串的字面量但不将其生成运行时的相关处理(如指令处理、内存处理等)。
看到这儿,是不是明白点意思了。其实这种未求值字符串存在的意义就是提供在编译期的支持而勿需将其应用拓展到运行时。这样首先就让人想到元编程的应用,活儿干了,还不影响运行。真是个不错的新功能。
二、应用说明
那么未求值字符串应用的场景有哪些呢?
1、元编程
在上面刚刚也提到了,它适合于在元编程时处理一些特定需求
2、编译期的消息处理
比如一些静态断言或者一些警告信息(比如哪个接口已经是要丢弃的等)以及一些特殊的编译指令,如#pragma message
3、处理一些与反射相关的功能
如处理一些类型操作符,typeid等
未求值字符串看上去是相当不错的,它只在编译期产生影响,对运行期的影响是零成本,而且可以在编译期向开发者提供显示的消息控制,这都是非常值得推荐。
三、例程
看一下相关的例程:
// 不生成数据
static_assert(sizeof(void*) == 8, "platform err!");
// 类型信息
constexpr auto typeName = typeid("Process").name();
//仅编译时处理
#pragma message("Complier msg!")
// 编译器处理条件编译
#if __has_cpp_attribute(deprecated)
# pragma message("is deprecated attribute")
#endif
这个功能更象一种细节上的完善,但这种完善琢磨起来确实又非常值得借鉴!
四、总结
未求值字符串的出现,其实体现了设计原则里面的精神,一方面,它体现了零成本抽象即没有增加运行开销(减少了二进制内容)的前提下加强了代码的控制;另一方面,它可以在编译期向开发者提供更好的文档式的消息控制。
从这一个小的方面上,就可以看出标准的大佬们还是很厉害的。所以新技术新标准的跟进还是要及时啊。