6

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

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

上面加粗的句子到底是什么意思?

编辑

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

4

1 回答 1

7

这意味着当您将常量用作常量时,就像您实际使用常量一样。

struct S {
  static const int i = 0;
};
int main() {
  return S::i;
}

虽然S::i有一个初始化程序,但它没有定义,但是您问题中的文本对于这样的用途有一个特殊的例外,其中S::i仅对其值进行访问。在这种情况下,不需要定义。

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

struct S {
  static const int i = 0;
};
int f(const int &i) {
  return i;
}
int main() {
  return f(S::i);
}

这个程序是无效的,并且被某些实现接受,但被其他实现拒绝。调用f需要存在的实际定义S::i,尽管如果f被内联,则可能会因为缺少定义而无法诊断。

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

$ g++ test2.cc -o test2
/tmp/ccdEsfxs.o:test2.cc:function main: 错误:未定义的对 'S::i' 的引用
collect2:错误:ld 返回 1 个退出状态

为了使它起作用,需要提供一个定义,如下所示:

struct S {
  static const int i = 0;
};
const int S::i;
于 2014-05-06T19:15:38.647 回答