我已经生成了下面的示例代码来说明我的问题:

#include <string>
#include <iostream>

class MyException
{
    public:
        MyException(std::string s1) {std::cout << "MyException constructor, s1: " << s1 << std::endl;}
};

int main(){
    const char * text = "exception text";
    std::cout << "Creating MyException object using std::string(const char *)." << std::endl;
    MyException my_ex(std::string(text));
    std::cout << "MyException object created." << std::endl;
    //throw my_ex;

    std::string string_text("exception text");
    std::cout << "Creating MyException object using std::string." << std::endl;
    MyException my_ex2(string_text);
    std::cout << "MyException object created." << std::endl;
    // throw my_ex2;

    return 0;
}

此代码段编译时没有任何错误,并产生以下输出:

 $ g++ main.cpp
 $ ./a.out
Creating MyException object using std::string(const char *).
MyException object created.
Creating MyException object using std::string.
MyException constructor, s1: exception text
MyException object created.

请注意,对于my_ex我定义的构造函数没有被调用。接下来,如果我真的想抛出这个变量:

throw my_ex;

我得到一个编译错误:

 $ g++ main.cpp
/tmp/ccpWitl8.o: In function `main':
main.cpp:(.text+0x55): undefined reference to `my_ex(std::string)'
collect2: error: ld returned 1 exit status

如果我在转换前后添加大括号,如下所示:

const char * text = "exception text";
std::cout << "Creating MyException object using std::string(const char *)." << std::endl;
MyException my_ex((std::string(text)));
std::cout << "MyException object created." << std::endl;
throw my_ex;

然后它就像我所期望的那样起作用了:

 $ g++ main.cpp
 $ ./a.out
Creating MyException object using std::string(const char *).
MyException constructor, s1: exception text
MyException object created.
terminate called after throwing an instance of 'MyException'
Aborted (core dumped)

我有以下问题:为什么我的第一个示例要编译?为什么我没有编译错误?

hyper_smurf2012hyper_smurf2012提问于
幽幽77IT从业者回答于

{}就可以。编译器(比如clang,没有额外的警告标志)可以提示:

warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]
    MyException my_ex(std::string(text));
                     ^~~~~~~~~~~~~~~~~~~
test.cpp:13:23: note: add a pair of parentheses to declare a variable
    MyException my_ex(std::string(text));
                      ^
                      (                )
1 warning generated.

会告诉你的错误在哪里。

回答过的其他问题

本地硬盘如何升级云硬盘?

幽幽77IT从业者
可以另外挂载一个云硬盘的 将以在北京地域下创建一块空的弹性云盘 cbs-test(有关什么是弹性云盘可以参考 云硬盘的分类,有关如何创建包含数据的云硬盘请参考快照创建云硬盘)、连接到云服务器实例、创建文件系统并向其中写入一个名为 qcloud.txt 的文件为例,帮助用户了解如...... 展开详请

2G行将退网,共享单车何去何从?

幽幽77IT从业者
共享单车为了铺开市场,很多都是采用“车海战术”,即用大量廉价车占领城市的每个角落。所以他的生产成本会被压到极其低。 车子扔出去了,就压根没想着拿回来。 目前主要用的MTK2503方案(2G),带GPS(或北斗)和多频GSM的一块开发板零售价还不到30块。大概就长下面这样。厂商批量...... 展开详请

如何结合腾讯云开发微信小程序?

幽幽77IT从业者
腾讯云 Tencent Cloud Base 团队开发了 tcb-router,云函数路由管理库方便大家使用。 架构一:一个云函数处理一个任务 这种架构下,其实不需要用到 tcb-router,像普通那样写好云函数,然后在小程序端调用就可以了。 云函数// 函数 router...... 展开详请

已申请了孵化计划是否支持申请放飞计划?

幽幽77IT从业者

这个活动好像是只能选择一个来做申请呢

自然场景文字识别技术及在地图中的应用

幽幽77IT从业者
自然场景文字识别的背景复杂,照片拍摄时的抖动,以及低分辨率、强光、阴影、噪声、艺术字、排列方式、模糊和遮挡等情况都给自然场景文字识别带来了很大的挑战。早先的传统文字识别方法基本都采用基于模板匹配的方式,此类技术针对自然场景下的文字识别几乎不起作用。目前自然场景文字识别中主流的实时...... 展开详请

cos-nodejs-sdk-v5 找不到getObjectUrl接口的说明?

关于作者

所属标签

扫码关注云+社区