Visual c++ 2008中的函数try块

Function try block in Visual C++ 2008

本文关键字:函数 try c++ 2008 Visual      更新时间:2023-10-16

Visual c++ 2008是否支持函数try块内部方法?

我试过这个代码:

class Foo
{
public:
    void f()
    try {}
    catch ( ... ) {}
};

但是编译器打印这个错误:

error c2590: 'f' : only a constructor can have a base/member initializer list

相同的语法(根据标准是有效的)在自由函数中也可以使用。

代码可以在新版本的Visual Studio和gcc上编译。

EDIT:没有,在我的代码中没有打字错误。c++标准说这是一个有效的语法。它叫做"function try block"

EDIT 2:如果我将方法定义移到类定义之外,visual c++ 2008将正确编译。

谢谢。

此特性仅适用于构造函数捕获成员变量内联初始化中的异常,例如:

struct a {
   a(const complex_object& value)
      : m_var(value)
   {}
private:
   complex_object m_var;
};

如果在complex_object的复制构造函数中抛出异常,则没有办法处理(除非更改m_var的初始化)。

http://msdn.microsoft.com/en-us/library/e9etx778%28v=vs.90%29.aspx

在这种情况下,function-try块用于处理此类异常,保持相同的初始化。

方法f不是类Foo的构造函数。

Daniele是对的Function-Try块可以在方法中使用,但通常这不会改善太多,在这种情况下,最好在方法体中使用try-catch块(允许必要时从catch块返回值)。

VS2008,不是一个专注于c++标准化的版本,VS2010改善了这个问题,但我认为还不够,后来的版本VS2012,特别是VS2013真的越来越接近一致性足够(特别是在日常使用中),他们有一些遗留的老难题,两阶段查找和预处理器,在角落的情况下可以吹你的头脑试图解决,特别处理可移植代码(与GCC, Intel等编译…),