这句话在C++ 11标准的第3.2.2段中意味着什么?

Wak*_*zil 6 c++ one-definition-rule language-lawyer c++11

该句是第3.2/2段的一部分:

名称显示为潜在评估表达式的变量是odr-used,除非它是满足出现在常量表达式(5.19)中的要求的对象,并且立即应用左值到右值转换(4.1).

粗体句子究竟是什么意思?

编辑:

这个被认为是重复的问题的答案,并没有说任何可以回答我的问题.

小智 7

这意味着当你使用常量作为常量时,就像你实际上使用常量一样.

struct S {
  static const int i = 0;
};
int main() {
  return S::i;
}
Run Code Online (Sandbox Code Playgroud)

虽然S::i有一个初始化器,但它没有定义,但是你的问题中的文本对这样的用途做了一个特殊的例外,S::i只有它的值被访问.在这种情况下,不需要定义.

另一方面,其他用途确实需要定义:

struct S {
  static const int i = 0;
};
int f(const int &i) {
  return i;
}
int main() {
  return f(S::i);
}
Run Code Online (Sandbox Code Playgroud)

该程序无效,并被某些实现接受,但被其他人拒绝.调用f要求S::i存在一个实际的定义,尽管如果f内联,可能缺少定义未被诊断.

在我的系统上,如果没有优化地编译和链接第二个程序,我得到:

$ g++ test2.cc -o test2
/tmp/ccdEsfxs.o:test2.cc:function main: error: undefined reference to 'S::i'
collect2: error: ld returned 1 exit status

为了使其工作,需要提供定义,如下所示:

struct S {
  static const int i = 0;
};
const int S::i;
Run Code Online (Sandbox Code Playgroud)