C标准:ODR和constexpr std :: string_view
如果我有一个包含foo.h的头文件
#ifndef FOO_H_ #define FOO_H_ namespace foo { constexpr std::string_view kSomeString = "blah"; } #endif // FOO_H_ 那么在单个程序中的多个.cc文件中包含foo.h是安全的,无论它们使用符号kSomeString做什么,或者是否有一些可能导致ODR违规的用途? 另外,是否可以保证kSomeString.data()将在.cc文件中返回相同的指针? 如果可能的话,我想特别提及C++ standard中的措辞.谢谢! 解决方法
仅包括来自多个翻译单位的foo.h不会违反ODR.但实际上,kSomeString的一些用途会违反ODR.有关详细信息和标准措辞,请参见此处:
https://stackoverflow.com/a/34446445
不能保证kSomeString.data()将在所有翻译单元中返回相同的值,因为不能保证字符串文字“blah”在所有翻译单元中都是相同的对象.根据[lex.string]/16,
在C17中,可以通过将kSomeString定义为内联来防止潜在的ODR违规.这将赋予它外部链接,从而在整个程序中提供单个地址(见[basic.link]/3和[basic.link]/4),并允许它进行多重定义(见[basic.def.odr]/4).显然.data()只能返回一个可能的值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |