我已经多次读过decltype(x)和decltype((x))之间的区别。一个例子如下。
x是变量的名称,因此decltype(x)是int。但是在括号中包含名称x - “(x)” - 会产生比名称更复杂的表达式。作为名称,x是左值,C ++也将表达式(x)定义为左值。因此,decltype((x))是int&amp ;.在名称周围加上括号可以改变decltype为其报告的类型!
有人可以向我显示变量的输出吗?其中decltype(x)和decltype((xx))的输出类型不同?我需要一个明确显示输出差异的例子。
欣赏这一点。 感谢。
答案 0 :(得分:6)
如果声明类型为decltype((x))
的变量,则它是一个引用。看到差异的最简单方法可能就是:
int x = 0;
decltype(x) copy = x; // creates an int which is a copy of x
decltype((x)) ref = x; // creates a reference to x
ref = 7; // changes x
copy = 99; // does not change x
std::cout << x << '\n'; // prints 7
std::cout << copy << '\n'; // prints 99
std::cout << ref << '\n'; // prints 7
至于何时使用decltype((x))
,我会毫不犹豫地说,但我可以说我没有理由在我自己的代码中这样做。
答案 1 :(得分:1)
我们说int a = 0
,然后decltype(a)
将是int
,因为a
直接命名实体。另一方面,decltype((a))
应为int&
,因为(a)
是一个不直接引用实体的表达式。
同样适用于成员,例如:
#include <iostream>
#include <type_traits>
struct S {
int v = 0;
};
int main() {
S s;
std::cout << std::is_same<decltype(s.v), int>() << std::endl;
std::cout << std::is_same<decltype((s.v)), int&>() << std::endl;
}
decltype(s.v)
是int
,因为s.v
直接引用实体的名称。另一方面,decltype((s.v))
是int&
。 (s.v)
不直接引用实体的名称。