C++11部分特性

预定义宏

1. func预定义标识符

功能:返回所在函数的名字
C++11中甚至允许在类或结构体中使用:

#include<iostream>
using namespace std;

class TestStruct {
public:
  TestStruct () : name(__func__) {}
  const char *name;
}; 

int main() {
  TestStruct ts;
  cout << ts.name <<endl; 
}

原理:编译器隐式地在函数定义后定义func表示符
所以需要注意的是func不能作为函数参数的默认值,因为在参数声明的时候,func还没有被定义

void testFun(string func_name = __func__) {};  //compile error

2.宏__cplusplus

C++11的__cplusplus被预定义为201103L,可以用

#ifdef __cplusplus < 201103L
    #error "please use C++11 implementation"
#endif

进行检测

静态断言

assert函数是在运行时进行断言,而当需要在编译时断言则需要使用静态断言,在C++11中,引入了static_assert,接受两个参数,static_assert ( bool_constexpr , message )一个是断言表达式(通常返回bool值),一个是警告信息

当然,利用“不能除以0”的性质也可以实现静态断言,但效果明显没有C++11标准中的好(毕竟标准直接报错警告信息,而这样实现只会报不能/0,这样还会增加调试难度)

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

#define assert_static(e) \
  do{ \
     enum{ assert_static__ = 1/ (e) }; \
  }while (0)
  
template <typename T, typename U> int bit_copy(T&a, U& b){
  assert_static(sizeof(b) == sizeof(a));
}
  
int main(){
  int a = 1;
  double b = 3;
  bit_copy(a,b);
}

noexcept修饰符与noexcept操作符

noexcept比throw()在效率上会高一些,在 C++11中,noexcept替代了throw()

noexcept修饰符

noexcept修饰符有两种形式,一种是直接加上关键字noexcept,而另外一种则可以接受一个常量表达式作为参数
void excpt_func() noexcept (常量表达式);
量表达式的结果会被转换成一个bool类型的值。该值为true,表示函数不会抛出异常,反之,则有可能抛出异常。这里,不带常量表达式的noexcept相当于声明了noexcept(true),即不会抛出异常。
在通常情况下,在C++11中使用noexcept可以有效地阻止异常的传播与扩散。

noexcept操作符

noexcept作为一个操作符时,通常可以用于模板。
我的测试代码:

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

class Test{
public:
  Test() {
    throw 1;
    cout<<"constructor"<<endl;
  }
  ~Test() {
    cout<<"dtor"<<endl; 
  }
};

template <class T>
  void fun() noexcept(noexcept(T())) {
    throw 1;
  }
  
int main(){
  try{
    fun<Test>(); 
  }
  catch(...){
    cout<<"caught"<<endl;  //caught
  }
  
  try{
    fun<int>(); 
  }
  catch(...){
    cout<<"caught"<<endl;  //terminate called after throwing an instance of 'int'
  }
  return 0;
}    

noexcept(noexcept(T()))中,第二个noexcept就是一个noexcept操作符。当其参数是一个有可能抛出异常的表达式的时候,其返回值为false,反之为true(实际noexcept参数返回false还包括一些情况,这里就不展开讲了)。
对于测试代码中的例子,当模板实参为Test时,Test()可能抛出异常,所以这时候此时签名修饰符为noexcept(false),所以可以抛出异常
而当模板实参为int的时候,noexcept(noexcept(T()))为noexcept(true),所以这时候试图抛出异常的话,会直接调用std::terminate终端程序的执行

另外需要注意的是,析构函数默认为noexcept,delete函数默认为noexcept

快速初始化成员变量

C++11增加允许了使用=或者花括号{}的方式来初始化:
struct init{ int a = 1; double b {1.2}; };
这样的方式也叫就地初始化,然而有一个问题,这样的初始化方式与初始化列表是否冲突?
当然不会冲突:

class Test{
public:
  Test(string ss = "234"):s(ss){}
  
  string s {"123"};
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359

推荐阅读更多精彩内容