c ++需要明确的例子来说明decltype(x)和amp;之间的区别。 decltype((X))

时间:2015-10-12 04:24:59

标签: c++ c++11

我已经多次读过decltype(x)和decltype((x))之间的区别。一个例子如下。

  

x是变量的名称,因此decltype(x)是int。但是在括号中包含名称x - “(x)” - 会产生比名称更复杂的表达式。作为名称,x是左值,C ++也将表达式(x)定义为左值。因此,decltype((x))是int&amp ;.在名称周围加上括号可以改变decltype为其报告的类型!

有人可以向我显示变量的输出吗?其中decltype(x)和decltype((xx))的输出类型不同?我需要一个明确显示输出差异的例子。

欣赏这一点。 感谢。

2 个答案:

答案 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)不直接引用实体的名称。