【问题标题】:Why does decltype remove const from return types for built-in types?为什么 decltype 从内置类型的返回类型中删除 const?
【发布时间】:2013-08-29 04:18:03
【问题描述】:

作为一般规则,decltype 保留常量:

const int ci = 0;
decltype(ci)  x;         // x is const int
x = 5;                   // error--x is const

class Gadget{}:

const Gadget makeCG();         // factory

decltype(makeCG()) y1, y2;     // y1 and y2 are const Gadgets
y1 = y2;                       // error--y1 is const

但是对于返回基本类型的 const 返回类型,decltype 似乎将 const 扔掉了:

const int makeCI();            // factory

decltype(makeCI()) z;          // z is NOT const
z = 5;                         // okay

为什么decltype 在这种情况下会丢弃常量?我的意思有两个方面:

  1. 标准的哪一部分规定了这种行为?
  2. 以这种方式指定行为的动机是什么?

谢谢。

【问题讨论】:

  • 为什么要通过 const 值返回?
  • @BillyONeal:一个很好的问题,但这并不会使这个问题无效。
  • @NicolBolas:我从未声称它确实如此。
  • @BillyONeal:我的兴趣在于理解 decltype,因为它对用户定义类型和基本类型以不同的方式处理返回值,我只是想知道为什么。

标签: c++ c++11 decltype


【解决方案1】:

您观察到的行为是正确的:decltype(makeCI())int,而不是 int const

makeCI() 函数调用表达式是纯右值表达式。根据 C++11 §3.10[basic.lval]/4:

类纯右值可以有 cv 限定类型;非类纯右值始终具有 cv 非限定类型。

术语“cv 限定”是指 const 和 volatile 限定。 int 不是类类型,所以右值表达式 makeCI() 的类型是 int 并且它不是 const 限定的。

(在最近的 C++ 语言标准草案中,例如 N3690,此文本已被删除并替换为 §5[expr]/6 中的新文本,其中指出,“如果纯右值最初具有类型“cv T, " 其中 T 是 cv 不合格的非类、非数组类型,表达式的类型在进行任何进一步分析之前会调整为 T。" 详情请参阅 CWG defect 1261。)

【讨论】:

  • 我觉得我真的需要多加注意。 +1。
  • 感谢您提供指向解决此问题的标准部分的指针。对动机有任何见解吗?
  • 我不知道这条规则的历史。此规则存在于 C++98 中。在大多数情况下,这无关紧要。 (例如,大多数内置操作在发生修改时需要可修改的左值,因此右值表达式的 const 限定无关紧要。)
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 2023-03-04
  • 1970-01-01
  • 2013-02-14
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多