deprecated用法
一个可运行的demo:

#include <iostream>

// [[deprecated]]
#if __cplusplus >= 201402
#   define  CPP_DEPRECATED [[deprecated]]
#else
#   define  CPP_DEPRECATED [[gnu::deprecated]]
#endif  // __cplusplus >= 201402

CPP_DEPRECATED
void add(int a,int b);

void add(int a,int b)
{
    int c = a + b;
    return;
}

int main()
{
    add(1,2);
    return 0;
}

编译结果:

[root c++]#g++ -g -std=c++14 deprecate.cc
deprecate.cc: In function ‘int main()’:
deprecate.cc:21:12: warning: ‘void add(int, int)’ is deprecated [-Wdeprecated-declarations]
     add(1,2);
            ^
deprecate.cc:13:6: note: declared here
 void add(int a,int b)
      ^~~
[root c++]#
[root c++]#
[root c++]#g++ -g -std=c++11 deprecate.cc
deprecate.cc: In function ‘int main()’:
deprecate.cc:21:12: warning: ‘void add(int, int)’ is deprecated [-Wdeprecated-declarations]
     add(1,2);
            ^
deprecate.cc:13:6: note: declared here
 void add(int a,int b)
      ^~~
[root c++]#

typeid无法正确识别引用类型

示例代码:

#include <iostream>
#include <typeinfo>
#include <cassert>

using namespace std;

int main()
{

    int x = 0;            // 整型变量

    decltype(auto)     x1 = (x);  // 推导为int&,因为(expr)是引用类型
    decltype(auto)     x2 = &x;   // 推导为int*
    decltype(auto)     x3 = x1;   // 推导为int&

    cout << typeid(x3).name() <<endl;
    x1 = 10;
    cout << "x = "<< x <<" x1= "<< x1 << endl;
    return 0;
}

运行程序后输出:
i
x = 10 x1= 10
可以验证对x1赋值后x的值变化,但是typeid却将类型识别为int(使用c++filt验证)

[root c++]#c++filt -t i
int

可以使用type_traits库来解决这个问题,示例代码:

#include <iostream>
#include <typeinfo>
#include <cassert>

using namespace std;

int main()
{

    int x = 0;            // 整型变量

    decltype(auto)     x1 = (x);  // 推导为int&,因为(expr)是引用类型
    decltype(auto)     x2 = &x;   // 推导为int*
    decltype(auto)     x3 = x1;   // 推导为int&

    assert(std::is_lvalue_reference<decltype(x1)>::value);
    assert(std::is_pointer<decltype(x2)>::value);
    assert(std::is_lvalue_reference<decltype(x3)>::value);
    return 0;
}

编译运行无输出验证x1 x3推到为int &,x2是指针

cmake升级问题记录

安装cpr时提示cmake版本过低,升级后使用cmake --version一直提示cmake-missing-modules-directory,参考stackoverflow中的答案,使用hash -r命令后版本显示正确。

Do hash -r to clear the cache, then do cmake --version.

cmake-missing-modules-directory

删除centos开机启动选项

在CentOS更新内核后,并不会自动删除旧内核。所以在启动选项中会有多个内核选项,可以手动使用以下命令删除多余的内核:
1.查看系统当前内核版本:
uname -a
Linux localhost.localdomain 3.10.0-229.20.1.el7.x86_64 #1 SMP Tue Nov 3 19:10:07 UTC 201
GNU/Linux
2.查看系统中全部的内核RPM包:
rpm -qa | grep kernel
kernel-3.10.0-229.14.1.el7.x86_64
kernel-3.10.0-229.el7.x86_64
abrt-addon-kerneloops-2.1.11-22.el7.centos.0.1.x86_64
kernel-tools-libs-3.10.0-229.20.1.el7.x86_64
kernel-3.10.0-229.20.1.el7.x86_64
kernel-tools-3.10.0-229.20.1.el7.x86_64
3.删除旧内核的RPM包
yum remove kernel-3.10.0-229.14.1.el7
yum remove kernel-3.10.0-229.el7
4.重启系统
reboot
注意:不需要手动修改/boot/grub/menu.lst

计算power(a,n)的一种方法

#include <iostream>
using namespace std;

int power(int a,int n)
{
    if(n == 0)
       return 1;
    int res = 1,tmp = a;
    while(n){
        if(n&1) {
        res *= tmp;
    }
    n >>= 1;
    tmp *= tmp;
    }
    return res;
}
int main()
{
   int n = 10;
   int sum = power(2,10);
   cout << sum << endl;

   return 0;
}