【问题标题】:Why is the behavior of decltype defined the way it is?为什么 decltype 的行为是这样定义的?
【发布时间】:2014-09-28 19:32:17
【问题描述】:

来自 C++ 标准草案 N3337:

7.1.6.2 简单类型说明符

4decltype(e)表示的类型定义如下:

——如果e是一个无括号的id-expression或一个无括号的类成员访问(5.2.5),decltype(e)e命名的实体的类型。如果没有这样的实体,或者如果e 命名了一组重载函数,则程序是非良构的;

——否则,如果 e 是一个 xvalue,decltype(e)T&&,其中 Te 的类型;

——否则,如果e是左值,decltype(e)就是T&,其中Te的类型;

如果我理解正确,

int a;
decltype(a) b = 10;    // type of b is int

int* ap;
decltype(*ap) c = 10;  // Does not work since type of c is int&

您能否解释一下,或指出一些解释为什么 decltype(*ap) 不能只是 int 的文档?

【问题讨论】:

  • 我假设你已经知道了 :),但为了记录,你可以使用 std::remove_referencestd::remove_pointer 来修改它。
  • @40two,是的,我知道这些实用程序。我试图理解为什么语言是这样定义的。
  • 我知道你知道这一点,因为你是这些场所的常见嫌疑人。我能想到的主要原因是在尾随返回中使用decltype。我想从类型中删除 & 在尾随返回中会很不方便。
  • @40two,这可能是(a)原因。

标签: c++11 decltype


【解决方案1】:

decltype 的标准化工作是一项跨越多年的艰巨努力。在委员会最终接受之前,这篇论文有 7 个版本。版本是:

值得注意的是,您质疑的行为的根源在于第一个修订版:N1478,它引入了“两种类型的 typeof:保留或删除类型中的引用”的需求。

本文继续给出了保留参考变体的基本原理,包括以下引用:

另一方面,引用删除语义未能提供 准确表达泛型返回类型的机制 功能,如 Stroustrup [Str02] 所示。这意味着 一个引用删除类型会导致作者的问题 通用库。

通读这些论文是无可替代的。然而,有人可能会总结出decltype 有两个目的:

  1. 报告标识符的声明类型。
  2. 报告表达式的类型。

对于第二个用例,请记住,表达式绝不是引用类型,而是左值、xvalue 或 prvalue 之一。按照惯例,decltype 在报告左值表达式的类型时,会将类型设为左值引用,而当表达式为 xvalue 时,报告的类型将成为右值引用。

在您的示例中,*ap 是一个表达式,而 a 是一个标识符。因此,您的示例利用了这两个用例,正如 N1478 中首次介绍的那样。

注意decltype 并不是孤立设计的,这也很有启发意义。在此期间,C++ 语言的其他部分也在不断发展(例如右值引用),decltype 的设计也不断迭代以跟上步伐。

还要注意,一旦decltype 提案被接受,它就会继续(并一直持续到今天)发展。请参阅此问题列表:

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_index.html

特别是第 7.1.6.2 节(这是大部分 decltype 规范所在的部分)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多