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-2std::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