有时我喜欢使用static const char*
/static const char[]
作为标识符而不是枚举,字符串文字指针的可靠性很好。
最近我一直在想,是否可以依赖constexpr
方法每次都返回相同的指针?具体来说:
struct traits_like
{
static constexpr const char* id() { return "special traits"; }
}
另外,在这种情况下,类似constexpr const char* id = "special traits"
或constexpr char[] id
的做法是否更好?
更新:
在我的用例中,我会有许多通过模板找到的traits(如类),因此理论上会看到类似TTraits1::id() == TTraits2::id()
的东西
2条答案
按热度按时间xqkwcwgp1#
CWG 1823的解决方案阐明了即使对相同的字符串常量进行重复求值也不必生成相同的字符串常量对象,特别是内联函数不必在不同的翻译单元或重复调用中返回相同的指针地址。
此外,多个字符串对象可能使用重叠存储,因此两个指向字符串的指针相等也不意味着它们具有相同的值。
knpiaxh12#
为了更好地实践,我建议使用
std::string_view
,例如:这是一个干净和简单的方式,更重要的是-给你一个方便的界面。
更完整的示例:
预期结果:
传递不带
name
的结构将导致编译错误:在我的用例中,我会有许多通过模板找到的traits类,因此理论上会看到类似于TTraits1::id()== TTraits2::id()的内容
使用上例中的元素,您可以简单地执行以下操作: