c++ - 我们如何从它的函数尝试处理程序跳回到构造函数主体?

标签 c++

免责声明:这个问题完全是理论性的,充满了想象和梦想,所以需要读者自行判断:)

所以我在阅读有关异常对象的内容,并且在 IBM C++ 引用资料中读到:

In a function try block’s handler, you cannot have a jump into the body of a constructor or destructor.

我知道为什么不应该尝试跳回构造函数的 body ......等等等等......但我更好奇如果这不是可憎的,我怎么能跳回构造函数的 body body 。

  1. 使用return语句
  2. goto 语句

或者作者正在使用另一种方法?

最佳答案

唯一和这个场景很接近的是Async/Await

Async-Await 关键字来自 C# 编程语言,可能是从 C++17 开始的标准的一部分。
Visual Studio 2015 RTM 已经支持这个极其重要的功能。

Async/Await 如下,如果 Z() 是一个异步函数,当这个流程发生时

X() 调用-> Y() 调用-> await Z()

Z() 将启动,代码流 跳回到 X() 而不会破坏 Y( )Z()。当 Z() 完成时,您可以异步跳回到 Y() calls-> await Z() 并返回 Z() 的结果,并从那里继续,因为该函数从未返回/销毁。

这是一个协程实现。

我为什么要说呢?因为您可以在构造函数中用 try/catch block 包装异步函数的 iside。

C++17 示例:

struct ContentManager{
   std::string m_data; 

   Awaitable<std::string> getDataFromTheNet(){/**/}
   std::future<void> initializeData(){
        try{
           m_data = await getDataFromTheNet();
        }catch(...){/* handle */}
   }

   ContentManager(){
       initializeData();
   }
};

在此示例中,您实际上从 try block 跳回到首先调用它的构造函数。

为什么不酷?
因为当ContentManager 构造完成后,作为开发人员的我认为对象被初始化了,但显然不是这样!

关于c++ - 我们如何从它的函数尝试处理程序跳回到构造函数主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34417630/

相关文章:

c++ - 如何在 C++ 中返回 NULL 对象

c++ - 如何更改 map 的第二个组件?

c++ - Windows 上 QtCreator 中的链接问题

c++ - __builtin_ctz(0)或__builtin_clz(0)有多不确定?

c++ - 为什么在 C++ 枚举定义中需要 typedef

c++ - 在存在不可预测的类型别名的情况下如何处理显式模板实例化?

c++ - C++0x 中有哪些新的 Unicode 函数?

c++ - std::function 参数子类

c++ - C++ 中的奇怪语法

c++ - OpenCV - 套接字接收到失真图像