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