这句话在 C++11 标准第 §3.2/2 段中是什么意思?



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

其名称显示为潜在求值表达式的变量为除非是满足要求的对象出现在常量表达式(5.19)和左值到右值之间转换(4.1)立即应用

上面黑体的句子到底是什么意思?

编辑:

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

这意味着当你使用一个常量时,它就像你实际使用一个常量一样。

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 - 0 test2/tmp/ccdEsfxs.o: test2。cc:函数main:错误:对S::i的未定义引用Collect2: error: ld returned 1 exit status之前

要使其工作,需要提供如下定义:

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

相关内容

  • 没有找到相关文章

最新更新