【发布时间】:2016-04-09 13:44:05
【问题描述】:
我试图更好地理解 decltype 以确定编译时表达式的类型。例如,假设我使用双变量:
#include <iostream>
#include <type_traits>
int main(){
double a;
typedef decltype(a) a_type;
typedef decltype((a)) ref_a_type;
typedef decltype(a)& o_ref_a_type;
a_type b;
ref_a_type c = b;
o_ref_a_type d = b;
if (std::is_same<decltype(b), double>::value) std::cout << "b is double\n";
if (std::is_same<decltype(c), double&>::value) std::cout << "c is double&\n";
if (std::is_same<decltype(d), double&>::value) std::cout << "d is double&\n";
}
如果我理解正确,这些点应该是正确的:
-
如果
a是左值,则decltype(a)返回double&,否则返回double。 - decltype 推断表达式的类型,除非它应用于变量,在这种情况下,它推断该变量的类型。
- 如果变量带括号,则变为左值表达式。
因此,decltype((a)) 和 decltype(a)& 在这种情况下是等价的,但并不总是等价的,例如,如果 a 不是变量:
typedef decltype((5)) ref_a_type;
typedef decltype(5)& o_ref_a_type;
那么这两种类型不相等(ref_a_type 是 int 和 o_ref_a_type 是 int&,因为在这种情况下额外的括号是无用的)。有人可以对此给出更好的解释吗?我应该使用第一种还是第二种方式?
IMO 第二种方式似乎比第一种方式更具可读性和可理解性。
【问题讨论】:
-
如果
T是非引用类型,那么decltype(f())是T,T&,T&&分别对应T f();,T& f();,T&& f();。
标签: c++ c++11 typetraits decltype