【发布时间】:2019-09-06 00:08:32
【问题描述】:
在 Bjarne Stroustrup 的书“C++ 编程语言(第 4 版)”中,第 1 页。 267(第 10.4.5 节地址常量表达式),他使用了一个代码示例,其中局部变量的地址设置为constexpr 变量。我觉得这看起来很奇怪,所以我尝试使用 g++ 版本 7.3.0 运行该示例,但无法获得相同的结果。这是他的代码示例逐字记录(虽然略有删节):
extern char glob;
void f(char loc) {
constexpr const char* p0 = &glob; // OK: &glob's is a constant
constexpr const char* p2 = &loc; // OK: &loc is constant in its scope
}
当我运行它时,我得到:
error: ‘(const char*)(& loc)’ is not a constant expression
g++ 是否发生了一些我不知道的事情,或者 Bjarne 的示例是否还有其他内容?
【问题讨论】:
-
显然,&loc 不能是 constexpr。但是,这些代码行并没有出现在我的 kindle 版本中。他确实在本地函数中显示了“C”样式字符串的地址的 constexpr。这是合法的,因为它们在全局空间中,而 loc 是堆栈上的参数而不是常量。你指的是那个例子吗?
-
char loc是本地声明的非静态字符。下次调用f()时,不能保证loc将具有相同的地址。 10.4.5 对链接器分配的地址和编译器分配的地址进行了区分。 2013 Stroustrup - The C++ Programming Language 4th Edition.pdf -
@DavidC.Rankin 看起来您的版本(pdf)与我的版本(硬拷贝)不同。这一定是一个错误,并且在您的 pdf 创建时已更新。
-
是的,我对
&glob的来源有点摸不着头脑,但&loc是可识别的。 -
@DavidC.Rankin 好点,我应该在我的问题中说明这一点。但是,是的,我认为这是因为我们的版本不同
标签: c++ c++11 constexpr memory-address