带双括号的decltype((x))是什么意思?

时间:2019-06-11 10:43:18

标签: c++ c++11 reference rvalue-reference decltype

非常简单的问题,我无法用谷歌搜索出答案。

例如:

int a = 0;
int& b = x;
int&& c = 1;

decltype((a)) x; // what is the type of x?
decltype((b)) y; // what is the type of y?
decltype((c)) z; // what is the type of z?

不确定,也许我应该为x,y和z分配一些值以获得不同的结果。

编辑: 根据以下括号中的位置,将示例int转换为参考: https://github.com/AnthonyCalandra/modern-cpp-features#decltype

int a = 1; // `a` is declared as type `int`
int&& f = 1; // `f` is declared as type `int&&`
decltype(f) g = 1; // `decltype(f) is `int&&`
decltype((a)) h = g; // `decltype((a))` is int&

3 个答案:

答案 0 :(得分:6)

所有类型均为int&

加上(a)之类的括号使它们成为表达式(而不是 entity ),它们都是左值(作为命名变量);那么decltype会变成T&,即这里的int&

  

...

     

4)如果参数是T类型的任何其他表达式,并且

     

...

     

b)如果表达式的值类别为左值,则decltype产生   T&;

     

...

您可以使用此LIVE DEMO(从编译错误消息中)检查实际类型。

答案 1 :(得分:4)

根据C++ Primer

  

当我们将unable to upload artifact应用于没有括号的变量时,我们得到   该变量的类型。如果我们将变量名包装成一个或   更多的括号,编译器会将操作数作为   表达。变量是可以在左侧的表达式   的任务。结果,这样的表达式上的decltype产生   参考:

decltype

答案 2 :(得分:3)

  

请注意,如果将对象名称加括号,则将其视为   一个普通的左值表达式,因此decltype(x)和decltype((x))是   通常是不同类型。

https://en.cppreference.com/w/cpp/language/decltype

据我了解,(x)是一个空表达式,它返回对x的引用。因此

  • decltype(x)int
  • declytpe((x))int&