【问题标题】:This seems to be an error in the book C++ Primer 5th edition这似乎是 C++ Primer 5th edition 一书中的错误
【发布时间】:2016-06-26 18:40:00
【问题描述】:

以下是《C++ Primer 5th edition》一书的节选(重点是我的):

非类型参数可以是整数类型,也可以是指针或(左值) 对对象或函数类型的引用。绑定到 a 的参数 非类型整数参数必须是常量表达式。 参数 绑定到指针或引用的非类型参数必须具有静态 终生(第 12 章,第 450 页)。我们不能使用普通的(非静态的) 本地对象或动态对象作为模板参数供参考 或指针非类型模板参数。指针参数也可以 由 nullptr 或零值常量表达式实例化。

在这一段的正下方可以找到这个突出显示的注释:

用于非类型模板参数的模板参数必须是 常量表达式。

也许我遗漏了一些东西,但我认为注释是错误的,因为指向对象或函数类型的指针或左值引用的非类型模板参数不是常量表达式。

【问题讨论】:

  • 也许我遗漏了什么是的,const 等等……没有理由不能将指针硬编码到一个函数等。跨度>
  • 什么是"指向对象或函数类型的指针或左值引用的非类型模板参数不是常量表达式" 它们可能既是const又是非常量表达式,取决于您如何声明/定义它们。要将它们用作模板非类型参数,您必须将它们用作 const 表达式
  • 如果我对您的理解正确,您会担心foo<&obj>。但是,您发布的引用指出:绑定到指针或引用非类型参数的参数必须具有静态生命周期
  • @chris 指向静态对象的指针可以被视为常量表达式吗?

标签: c++ templates pointers reference


【解决方案1】:

如果您担心下面的非类型指针,那么您对具有指向函数模板参数的非类型指针的结构进行了完全有效的特化:

void foo() { }

template <void(*)()>
struct bar { };

int main() {
   bar<&foo> b; 
}

这里的&amp;foo 也是一个常量表达式,因为它具有静态生命周期。

正如 Revolver_Ocelot 提到的 5.20[expr.const] /5 和 5.2 明确指出的那样:

常量表达式要么是左值核心常量表达式 其值指的是一个实体,该实体是一个允许的结果 常量表达式(定义如下),或纯右值核心常量 表达式,其值为对象 where,对于该对象及其 子对象:

(...)

  • 如果对象或子对象是指针类型,它包含具有静态存储持续时间的对象的地址,地址过去 此类对象的结尾 (5.7)、函数的地址或 null 指针值

(我使用草稿 N4296)

【讨论】:

  • The &amp;foo here is also a constant expression as it has static lifetime. 您能否指出标准中的一个引用来证实这一点,即&amp;foo 是一个常量表达式?
  • @JohnKalane 14.3.2/1 [temp.arg.nontype]
  • @JohnKalane 也是 5.19/4 [expr.const]
  • @Revolver_Ocelot 快到了...谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多