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

时间:2014-05-06 19:11:08

标签: c++ c++11 language-lawyer one-definition-rule

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

  

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

粗体句子到底意味着什么?

修改

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

1 个答案:

答案 0 :(得分: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: error: undefined reference to 'S::i'
collect2: error: ld returned 1 exit status

为了使其有效,需要提供一个定义,如下所示:

struct S {
  static const int i = 0;
};
const int S::i;