A Quiz of C++ const

在vs2010环境下, 如下程序会输出什么?

#include <string>
#include <iostream>
using namespace std;

template<class T>
struct print;

template<>
struct print<int> { static string name() { return "int"; } };

template<class T>
struct print<T&> { static string name() { return print<T>::name() + " &"; } };

template<class T>
struct print<const T> { static string name() { return "const " + print<T>::name(); } };

// just utility functions above

struct S { int i; };

template<class T>
void foo(T) { cout << print<T>::name() << endl; }

template<class T>
void bar(T&) { cout << print<T>::name() << endl; }

int main() {
    int i;
    const int ci = 0;
    const int *pci = &i;
    S s;
    const S *pcs = &s;

    foo(i);
    foo(ci);
    foo(*pci);
    foo(pcs->i);

    bar(i);
    bar(ci);
    bar(*pci);
    bar(pcs->i);

    {
        auto a1 = i;
        auto a2 = ci;
        auto a3 = *pci;
        auto a4 = pcs->i;
        cout << print<decltype(a1)>::name() << endl;
        cout << print<decltype(a2)>::name() << endl;
        cout << print<decltype(a3)>::name() << endl;
        cout << print<decltype(a4)>::name() << endl;
    }

    {
        auto& a1 = i;
        auto& a2 = ci;
        auto& a3 = *pci;
        auto& a4 = pcs->i;
        cout << print<decltype(a1)>::name() << endl;
        cout << print<decltype(a2)>::name() << endl;
        cout << print<decltype(a3)>::name() << endl;
        cout << print<decltype(a4)>::name() << endl;
    }

    cout << print<decltype(i)>::name() << endl;
    cout << print<decltype(ci)>::name() << endl;
    cout << print<decltype(*pci)>::name() << endl;
    cout << print<decltype(pcs->i)>::name() << endl;

    cout << print<decltype((i))>::name() << endl;
    cout << print<decltype((ci))>::name() << endl;
    cout << print<decltype((*pci))>::name() << endl;
    cout << print<decltype((pcs->i))>::name() << endl;

    return 0;
}

现在还敢说你精通C++吗?

答案参见此文, 以及我的笔记.

Comments 1

  1. OWenT wrote at 2011-04-29 11:23

    我发现你的测试写的很全,不过我提一个意见。我觉得测试应该注重测试的东西,代码应该尽量简单易懂。而你的好长一坨,没有分块,起码我用手机看起来很吃力。
    另外我记得const_cast可以把const关键字申明的类型转成非const的,也许你也可以玩玩

Post a Comment

Your email is never published nor shared. Required fields are marked *