【发布时间】:2017-03-09 23:46:50
【问题描述】:
正如我在 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 能够产生一个参考。所以他们只是滚动随机语法骰子来得出括号。
-
@TartanLlama,
decltype(auto)出现在c++14,而decltype规范是这样的,因为c++11,这对我来说似乎不是原因。 -
老实说,这对我来说感觉很自然。
decltype(identifier)是标识符的类型。如果它是一个非 id 表达式,那么它是 T& 如果它是一个左值,因为这就是 C++ 所说的“左值指定其他东西” -
很明显,他们希望人们停止在
return表达式中随意加上括号。
标签: c++ c++11 c++14 decltype type-deduction