jac*_*bsa 15 c++ linkage language-lawyer c++11 c++17
想象一下,我们有一个foo.h包含以下内容的标题:
#ifndef FOO_H_
#define FOO_H_
namespace foo {
constexpr std::string_view kSomeString = "blah";
}
#endif // FOO_H_
Run Code Online (Sandbox Code Playgroud)
为foo::kSomeString保证在任何翻译单元,包括内部联动foo.h?这在C++ 11和C++ 17之间有所不同吗?
在草案标准[basic.link]/3中说
具有命名空间作用域的名称具有内部链接,如果它是非易失性const限定类型的非内联变量的名称,该变量既未显式声明为extern,也未声明为具有外部链接[...]
但我不知道是否constexpr算作"const-qualified".标准是否在某处说出来?
假设这保证具有内部链接,看起来ODR对此用法没有问题,对吧?(与此答案中的内容形成鲜明对比.)
T.C*_*.C. 18
是的,constexpr在对象声明上表示对象是const.见[dcl.constexpr]/9.是的,这意味着kSomeString在您的示例中有内部链接.
我们在这里讨论的ODR违规的种类不是kSomeString它自己的定义,而是试图使用它的其他定义.正是由于内部联系,存在一个问题.考虑:
void f(const std::string_view &);
inline void g() {
f(foo::kSomeString);
}
Run Code Online (Sandbox Code Playgroud)
如果包含在多个翻译单元中,则这是ODR违规,主要是因为g每个翻译单元中的定义引用了不同的对象.
| 归档时间: |
|
| 查看次数: |
1514 次 |
| 最近记录: |