为什么这些类型不一样?

4
为什么 T1 和 T2 的 typeid 相同但却不是相同的类型?(输出结果为 1 0
#include <iostream>
#include <typeinfo>
#include <type_traits>

int main()
{
  using T1 = decltype("A");
  using T2 = const char[2];
  std::cout << (typeid(T1) == typeid(T2)) << "\n";
  std::cout << std::is_same_v<T1,T2> << "\n";
} 

3
https://godbolt.org/z/8M4G1T61q - Marek R
3
https://godbolt.org/z/8M4G1T61q - Marek R
3
https://godbolt.org/z/8M4G1T61q - undefined
很棒的想法,谢谢。 - Helmut Zeisel
顺便提一下,在最近的编译器中,可以使用std::source_location::current().function_name()。 - Helmut Zeisel
显示剩余4条评论
2个回答

5
字符串字面量像"A"这样的是lvalue表达式,因为decltype的效果导致了lvalue引用,所以T1将是const char (&)[2]

如果表达式的值类别是lvalue,则decltype产生T&

T2const char[2],对T1进行typeid操作将得到引用类型的结果,即const char[2],这就是为什么typeid(T1) == typeid(T2)true,但std::is_same_v<T1,T2>false
如果类型是引用类型,结果将引用一个表示所引用类型的非cv限定版本(自C++11起)的std::type_info对象。

5

T1的类型是const char(&)[2]。引用是const char[2]的别名,并且具有相同的typeid

#include <iostream>
#include <typeinfo>
#include <type_traits>

int main()
{
  using T1 = decltype("A");
  using T2 = const char[2];
  using T3 = T2&;
  std::cout << (typeid(T1) == typeid(T2)) << "\n";
  std::cout << std::is_same_v<T1,T3> << "\n";
}

输出

1
1

1
(&amp;) 放在括号里是常见的吗?省略它们是不正确的吗? - Thomas Weller
1
在括号中放置(&)常见吗?省略它们是不正确的吗? - Thomas Weller
1
在括号中放置(&)常见吗?省略它们是不正确的吗? - undefined
1
@Thomas 这是运算符优先级。如果您省略括号,则定义了一个字符引用数组,而不是字符数组的引用。 - 273K
1
@Thomas 这是操作符优先级的问题。如果省略括号,你定义的是一个指向字符的引用数组,而不是一个指向字符数组的引用。 - 273K
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接