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

#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提问于
社会人就是请不要忘记微笑!回答于
已采纳

C++11支持:

MyException my_ex1((std::string(text)));
MyException my_ex2{std::string(text)};
MyException my_ex3{std::string{text}};

回答过的其他问题

2018有哪些值得关注的技术趋势?

社会人就是请不要忘记微笑!
我是做通信的,我可以明确告诉你,在通信行业,2018最关键的技术就是5G技术。5G是新一代移动通信技术的简称,相比4G,它最突出的特点就是“快”,网络平均速率可达到10Gbps左右,是4G网络的100倍以上,一秒钟就能下载一部高清电影。 在我国,5G技术发展飞快,5G研发试验第三...... 展开详请

数据可视化在生活的哪里可以应用?

社会人就是请不要忘记微笑!
许多行业都可以利用大数据可视化,把复杂数据采取多种静态和动态方式直观呈现出来。下面介绍几种大数据可视化在各行业中应用: 政府—实现科学决策和高效治理 数据可视化的应用使得政府能够借助数据,制定及时、高效、准确的治理手段和决策管理,进行多方位布局和监管。不仅如此,数据可视化还可...... 展开详请

从技术上看待长截屏,如何实现这一功能?

社会人就是请不要忘记微笑!
1、通过遍历Activity主窗口的View树,来找到可以滚动的ViewGroup,并存储它的四个布局参数。 2、再次遍历Activity的所有窗口的View树,然后对比布局参数找到位于滚动ViewGroup之上的View,并设置它们为INVISIBLE。 3、检查该应用的Ser...... 展开详请

深度学习在腾讯云上有哪些应用?

社会人就是请不要忘记微笑!
我讲点简单的吧,腾讯云OCR产品的应用,在日常生活工作中,我们难免会遇到一些问题,比如自己辛辛苦苦写完的资料,好不容易打印出来却发现源文件丢了;收集了一些名片,却要一个一个地录入信息,很麻烦;快递公司的业务越来越好,但每天需要花费很多时间登记录入运单,效率非常的低。那么,有没有什...... 展开详请

腾讯云AI有哪些应用?

社会人就是请不要忘记微笑!
腾讯云AI的应用主要有: 腾讯人工智能业务应用 第一是微信。语音输入是腾讯在微信AI的大胆尝试。通过在输入框输入语音,语音就可以转化为文字。看似是一个非常简单的AI应用,背后却隐藏着复杂的语音识别算法。其次是在QQ音乐里的尝试。当我们听到一首歌但却不知道歌的作曲和演唱者的时候,就...... 展开详请

输入pm2 logs 之后如何继续输入终端命令?

社会人就是请不要忘记微笑!

关于作者

所属标签

扫码关注云+社区