C++ Primer 5e 习题2.5: 指出如下字面量常量的类型

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
true2.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值