C++ standard: ODR and constexpr std::string_view
C++ standard: ODR and 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++标准中的措辞。谢谢!
仅包含来自多个翻译单元的foo.h
不会违反 ODR。但是,确实有一些kSomeString
的使用会违反ODR。有关详细信息和标准措辞,请参阅此处:https://stackoverflow.com/a/34446445
不能保证kSomeString.data()
在所有翻译单元中返回相同的值,因为不能保证字符串文本"blah"
在所有翻译单元中都是同一对象。根据 [lex.string]/16,
会生成具有静态存储持续时间的字符串文本对象,该对象从上面指定的给定字符初始化。是否所有字符串文本都是不同的(即,存储在非重叠对象中(,以及字符串文本的连续计算是否产生相同或不同的对象。[注意:尝试修改字符串文本的效果未定义。— 尾注]
在 C++17 中,可以通过定义要inline
kSomeString
来防止潜在的 ODR 违规。这将给它外部链接,从而在整个程序中提供一个单一的地址(参见[basic.link]/3和[basic.link]/4(,并允许它被乘法定义(参见[basic.def.odr]/4(。显然,.data()
只能返回一个可能的值。
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- C++:考虑C++ std::string 中双引号 (") 的字面含义,而不使用反斜杠 (\)
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ 在列表和列表之间选择返回类型<<string>std::p air<string,string>>
- std::string, std::wstring and UTF8
- uan inplace replacement of std::string/std::wstring?
- #define Glib::string std:wstring
- 从 std::string & std::wstring 中获取 char 整数值
- BSTR转换为std::string(std::wstring),反之亦然