Exercise 2.5: Determine the type of each of the following literals. Explain
the differences among the literals in each of the four examples: (a) ‘a’, L’a’, “a”, L"a"
(b) 10, 10u, 10L, 10uL, 012, 0xC
© 3.14, 3.14f, 3.14L
(d) 10, 10u, 10., 10e-2
既然是C++11,那就使用用 std::is_same
在编译期判断类型。
- 对于小白来说,
10.
会被误以为是 float 类型,其实是 double - 对于
"a"
来说, 小白会以为是const char*
, 或const char[2]
, 但其实是const char(&)[2]
- 「模板 + 宏,威力无穷」:
show_type
模板函数, 搭配__PRTTY_FUNCTION__
获取到了上述类型
#include <type_traits>
#include <iostream>
template<typename T>
void show_type() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
int main()
{
std::cout << std::boolalpha;
// 'a' 的类型
std::cout << std::is_same<decltype('a'), char>::value << std::endl;
// L'a' 的类型
std::cout << std::is_same<decltype(L'a'), wchar_t>::value << std::endl;
// "a" 的类型
std::cout << std::is_same<decltype("a"), const char[2]>::value << std::endl;
show_type<decltype("a")>(); // 输出实际类型
std::cout << std::is_same<decltype("a"), const char(&)[2]>::value << std::endl;
// L"a" 的类型
std::cout << std::is_same<decltype(L"a"), const wchar_t(&)[2]>::value << std::endl;
// 10 的类型
std::cout << std::is_same<decltype(10), int>::value << std::endl;
// 10u 的类型
std::cout << std::is_same<decltype(10u), unsigned>::value << std::endl;
// 10L 的类型
std::cout << std::is_same<decltype(10L), long>::value << std::endl;
// 10uL 的类型
std::cout << std::is_same<decltype(10uL), unsigned long>::value << std::endl;
// 012 的类型
std::cout << std::is_same<decltype(012), int>::value << std::endl;
// 0xC 的类型
std::cout << std::is_same<decltype(0xC), int>::value << std::endl;
// 3.14 的类型
std::cout << std::is_same<decltype(3.14), double>::value << std::endl;
// 3.14f 的类型
std::cout << std::is_same<decltype(3.14f), float>::value << std::endl;
// 3.14L 的类型
std::cout << std::is_same<decltype(3.14L), long double>::value << std::endl;
// 10 的类型
std::cout << std::is_same<decltype(10), int>::value << std::endl;
// 10u 的类型
std::cout << std::is_same<decltype(10u), unsigned>::value << std::endl;
// 10. 的类型
std::cout << std::is_same<decltype(10.), double>::value << std::endl;
// 10e-2
std::cout << std::is_same<decltype(10.), double>::value << std::endl;
return 0;
}
运行结果:
➜ 2.5 git:(2.1) ✗ g++ main.cpp -std=c++11
➜ 2.5 git:(2.1) ✗ ./a.out
true
true
false
void show_type() [T = const char (&)[2]]
true
true
true
true
true
true
true
true
true
true
true
➜ 2.5 git:(2.1) ✗ g++ main.cpp -std=c++11
➜ 2.5 git:(2.1) ✗ ./a.out
true
true
false
void show_type() [T = const char (&)[2]]
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
如何声明数组的引用类型?
用 <type>(&var_name) [n] = array_var
. 例如:
#include <type_traits>
#include <iostream>
int main()
{
std::cout << std::boolalpha;
const char b[2] = "b";
const char(&c)[2] = b;
std::cout << std::is_same<decltype("a"), decltype(b)>::value << std::endl;
std::cout << std::is_same<decltype("a"), decltype(c)>::value << std::endl;
char d[2] = "d";
char(&e)[2] = d;
std::cout << "before:\n";
std::cout << "d: " << d << std::endl;
std::cout << "e: " << d << std::endl;
e[0] = 'e';
std::cout << "after:\n";
std::cout << "d: " << d << std::endl;
std::cout << "e: " << d << std::endl;
return 0;
}
运行结果:
➜ 2.5 git:(2.1) ✗ g++ main.cpp -std=c++11
➜ 2.5 git:(2.1) ✗ ./a.out
false
true
before:
d: d
e: d
after:
d: e
e: e