C++11——大型程序工具

noexcept异常标识符

在新标准下,函数可以通过提供noexcept标识符来指定它不会抛出异常。函数参数列表后面的关键字noexcept表示该函数不会抛出:

Code:
    void recoup(int) noexcept;  // won't throw
    void alloc(int);            // might throw

上述代码中recoup不会抛出任何异常,而alloc可能会抛出异常。我们说recoup有一个非nonthrowing specification。
noexcept说明符必须出现在所有声明和函数的相应定义上,或者不出现在任何声明上。说明符在尾随返回之前。我们还可以在函数指针的声明和定义上指定noexcept。它可能不会出现在typedef或类型别名中。在成员函数中,noexcept说明符跟随在任何const或引用限定符之后,并且它在虚函数上的finaloverride= 0之前。

noexcept运算符

noexcept说明符的参数通常使用noexcept运算符构成。noexcept运算符是一元运算符,它返回一个bool类型的右值常量表达式,指示给定表达式是否可能抛出。与sizeof一样,noexcept不计算其操作数。
例如,下面的表达式将得到true

Code:
    noexcept(recoup(i)) // true if callingrecoup can't throw, false otherwise

因为我们用noexcept说明符声明了recoup。更一般的:

Code:
    noexcept(e)

如果e调用的所有函数都具有非抛出标识符且e本身不包含throw,则上式为true。否则上式返回false
我们可以使用noexcept运算符来形成异常说明符,如下所示:

Code:
    void f() noexcept(noexcept(g())); // f has same exception specifier as g

如果函数g承诺不抛出,则f也是非抛出的。如果g没有异常说明符,或者有一个允许异常的异常说明符,那么f也可能抛出。
注:noexcept有两个含义:当它跟随在函数的参数列表之后时,它是一个异常说明符;当用作noexcept异常说明符的bool参数时,它是一个运算符。

内联命名空间

新标准引入了一种新的嵌套命名空间,即内联命名空间。与普通的嵌套命名空间不同,内联命名空间中的名称可以像使用封闭命名空间的直接成员一样使用。也就是说,我们不需要通过命名空间名称限定内联命名空间中的名称。我们只能使用封闭命名空间的名称来访问它们。
内联命名空间是通过在关键字namespace前面加上关键字inline来定义的:

Code:
    inline namespace FifthEd {
        // namespace for the code from the Primer Fifth Edition
    }
    namespace FifthEd { // implicitly inline
        class Query_base { /* ... * /};
        // other Query-related declarations
    }

关键字inline必须出现在命名空间的第一个定义中。如果后面重新打开命名空间,则关键字inline不是必须的,但可以重复使用。
当代码从应用程序的一个版本更改为下一个版本时,通常会使用内联命名空间。例如,我们可以将当前版本的Primer中的所有代码放入内联命名空间。以前版本的代码将位于非内联命名空间中:

Code:
    namespace FourthEd {
        class Item_base { /* ... */};
        class Query_base { /* ... */};
        // other code from the Fourth Edition
    }

整个cplusplus_primer命名空间将包括两个命名空间的定义。例如,假设每个命名空间都在具有相应名称的头文件中定义,我们将cplusplus_primer定义如下:

Code:
    namespace cplusplus_primer {
    #include "FifthEd.h"
    #include "FourthEd.h"
    }

因为FifthEd是内联的,所以引用cplusplus_primer::的代码将从该命名空间获取版本。如果我们想要早期版本的代码,我们可以像使用任何其他嵌套命名空间一样访问它,方法是使用所有封闭命名空间的名称:例如:

Code:
    cplusplus_primer::FourthEd::Query_base

继承的构造函数和多重继承

在新标准下,派生类可以从一个或多个基类继承其构造函数。从多个基类继承相同的构造函数(即具有相同参数列表的构造函数)是错误的:

Code:
    struct Base1 {
        Base1() = default;
        Base1(const std::string&);
        Base1(std::shared_ptr<int>);
    };
    struct Base2 {
        Base2() = default;
        Base2(const std::string&);
        Base2(int);
    };
    // error: D1 attempts to inherit D1::D1 (const string&) from both base classes
    struct D1: public Base1, public Base2 {
        using Base1::Base1;  // inherit constructors from Base1
        using Base2::Base2;  // inherit constructors from Base2
    };

从多个基类继承相同构造函数的类必须定义其自己的构造函数版本:

Code:
    struct D2: public Base1, public Base2 {
        using Base1::Base1;  // inherit constructors from Base1
        using Base2::Base2;  // inherit constructors from Base2
        // D2 must define its own constructor that takes a string
        D2(const string &s): Base1(s), Base2(s) { }
        D2() = default;     // needed once D2 defines its own constructor
    };

参考文献

[1] Lippman S B , Josée Lajoie, Moo B E . C++ Primer (5th Edition)[J]. 2013.

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

推荐阅读更多精彩内容