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_

那么,将它们包含在单个程序中的foo.h多个.cc文件中是否安全,无论它们对符号有何作用kSomeString,还是有可能导致违反ODR的某些用途?

另外,是否可以保证kSomeString.data().cc文件之间返回相同的指针

如果可能的话,我希望对C ++标准中的措词有特定的引用谢谢!

布赖恩

仅包含foo.h多个翻译部门的内容就不会违反ODR。但是,确实有一些使用kSomeString会违反ODR。有关详细信息和标准措辞,请参见此处:https : //stackoverflow.com/a/34446445

它不能保证kSomeString.data()将在所有的翻译单位返回相同的值,因为它不能保证该字符串字面量"blah"是在所有的翻译单位相同的对象。根据[lex.string] / 16

计算字符串字面量会导致字符串文字对象具有静态存储期限,并从上面指定的给定字符初始化。是否所有字符串文字都是不同的(即存储在不重叠的对象中)以及对字符串文字的连续求值是否得出相同或不同的对象,尚不确定。[ 注意:尝试修改字符串文字的效果是不确定的。—尾注 ]

在C ++ 17中,可以通过定义kSomeString为来防止潜在的ODR违规inline这将使它具有外部链接,从而在整个程序中具有一个地址(请参阅[basic.link] / 3[basic.link] / 4),并允许对其进行多重定义(请参阅[basic.def.odr] / 4))。显然.data()只能返回一个可能的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不支持串联std :: string和std :: string_view?

std :: string_view编译时哈希

在C ++ 17中没有从std :: string到std :: string_view的隐式转换(在std :: experimental :: basic_string_view中)

什么时候std :: string_view :: operator ==真的是constexpr?

结合使用std :: string_view和api,期望以null结尾的字符串

如何在constexpr string_view上使用std :: string_view :: remove_prefix()

从大括号的std :: string构造std :: string_view,clang和gcc不赞成-Wconversion

std :: unordered_set中的std :: string_view和std :: string

STL容器的std :: string_view

std :: string_view可以复制吗?

如何哈希std :: string_view?

gsl :: string_span和std :: string_view有何区别?

用constexpr std :: string_view枚举vs用std :: string实例化的枚举

为什么std :: string_view不具有Assign()和clear()方法?

hash <std :: string>与hash <std :: string_view>

为什么在C ++标准中不存在类std :: basic_string的构造函数,且其参数类型为std :: string_view

通过引用传递std :: string_view

带有自己的类和std :: string_view的'operator =='的模棱两可的重载

如何解决C ++ std :: string_view超出范围的问题?

noexcept std :: string_view的构造函数

构造函数采用std :: string_view与std :: string并移动

C ++ 20在string / u8string和string_view / u8string_view之间转换

如何在C ++中输入std :: string_view?

如何将 boost::string_view 转换为 std::string_view?

带有 C 函数的 std::string_view

如何从 std::string_view 正确创建 std::string?

C++ 17 STL std::string_view 是否符合 RAII 设计理念?

从 std::string_view 创建 std::string

printf() std::string_view 的正确方法?