c++ - decltype行为背后的理由是什么?




c++11 c++14 (2)

正如我在C ++ 11中所理解的, decltype(expression) 用于推断给定表达式的完全相同类型。 但是当表达式放入括号本身时,则推导类型是对表达式类型的 左值引用 。 例如:

int x;
decltype(x) y = x;

相当于 int y = x; 但,

int x;
decltype((x)) y = x;

相当于 int& y = x;

分别

 decltype(auto) f1()
 {
   int x = 0;
   return x; // decltype(x) is int, so f1 returns int
 }

 decltype(auto) f2()
 {
   int x = 0;
   return (x); // decltype((x)) is int&, so f2 returns int&
 }

标准委员会选择这种行为的理由是什么?

后记:

现在我观察到,至少在 GCC 6.2 实现的情况下,当括号中的表达式更复杂时,例如 decltype((x + x)) ,推导出的类型是 T ,而不是 T& 。 这更令人困惑。 我不知道这种行为是否标准。


他们想要一种方法来获得标识符的声明类型。

他们还想要一种方法来获取表达式的类型,包括它是否是临时的信息。

decltype(x) 给出标识符 x 的声明类型。 如果你传递的 decltype 不是一个标识符,它会确定类型,然后为lvalues附加 & ,为xvalues附加 && 为prvalues添加任何内容。

从概念上讲,您可以将其视为变量类型与表达式类型之间的差异。 但这并不是标准如何描述它。

他们可以用两个不同的关键词来表示这两件事。 他们没有。


来自 decltype 提案的作者之一J. Jarvi:

已经有一段时间了,但这就是我(我想)记得的:

从未考虑过用于区分这两种语义的两个单独的关键字。 (引入新关键字不是轻易做到的)。

至于 decltype((x)) 的语义变化,核心工作组的讨论融合到将 (x) 视为表达式而不是标识符,它可能与语言规则更“内部一致”。

人们意识到这在某些情况下可能会令人困惑,但是共识(尽管可能不是每个人的偏好)最终都与标准的先前定义一致,即什么是标识符,什么是表达式。

你链接到[这个问题的例子]的例子确实令人惊讶。 当时,使用 decltype(auto) 从返回表达式中推导函数的返回类型还不是语言的一部分,所以我不认为这个特定的用例是在任何人的雷达上。





type-deduction