【发布时间】:2019-09-23 15:32:43
【问题描述】:
即使在阅读了标题中定义的this question about non explicit inline namespace scoped variables 之后,我还是有点偏执于明确的内联命名空间范围变量是可以的,因为针对 ODR 的 AFAIK 违规是 UB 并且不需要诊断。我的理解是否正确,明确内联指定 constexpr(和 const 非易失性类似)在命名空间范围内定义的变量是 内联变量,因此在不同的翻译单元中使用它们的 ODR 使用是可以的吗?
甚至 cppreference.com 也自相矛盾,有时它说内联变量必须是 ODR 使用异常的外部变量,而在另一个页面上,通常只有内部链接内联变量是可以的,而外部只有附加要求。
这些假设基本上是对的吗?:
/*! @file some_header.hpp */
#ifndef HEADER_GUARD
#define HEADER_GUARD
constexpr int global_non_expl_inline = 42; //UB
static constexpr int global_non_expl_inline_static = 42; //UB
inline int global_expl_inline = 42; //ok
inline int static global_expl_inline_explicit_static = 42; //? external linkage by default but static explicit but still ok?
inline int extern global_expl_inline_explicit_extern = 42; //UB
namespace foo {
constexpr int global_non_expl_inline = 42; //UB
static constexpr int global_non_expl_inline_static = 42; //UB
inline int global_expl_inline = 42; //ok
inline int static global_expl_inline_explicit_static = 42; //? external linkage by default but static explicit but still ok?
inline int extern global_expl_inline_explicit_extern = 42; //UB
}
namespace {
inline int extern global_expl_inline_explicit_extern_but_unnamed_ns = 42; //ok
}
struct bar{
static int const in_class_static = 42;//ok
static int in_class_but_out_of_source_def;
};
int bar::in_class_but_out_of_source_def = 42;//UB
#endif
【问题讨论】:
-
constexpr int global_non_expl_inline = 42;为什么这个和其他会是 UB?除了extern,这些项目似乎都很好。 -
“甚至 cppreference.com 都自相矛盾”。哪些页面?
-
我认为你链接的问题解释了它。它们是具有内部链接的内联变量,如果您有一个内联函数绑定从不同翻译单元调用的对它们的引用,那么这个问题可能会困扰您。您能否更具体地说明您的问题的性质?
-
@Jarod42 en.cppreference.com/w/cpp/language/inline with "内联函数或内联变量 (C++17 起) 具有以下属性:" vs en.cppreference.com/w/cpp/language/definition " 内联变量与外部链接 (C++17 起) ...只要满足以下所有条件:"
-
@VTT 因为它是一个非内联非易失性 const 限定变量,它具有内部链接并且违反了 ODR?另见stackoverflow.com/a/46107877/3537677
标签: c++ language-lawyer c++17 one-definition-rule