C++ 捕获而不尝试成功编译
以下代码使用g++版本5.1.0成功编译。注意成员函数C++ 捕获而不尝试成功编译,c++,language-lawyer,C++,Language Lawyer,以下代码使用g++版本5.1.0成功编译。注意成员函数foo::bar()中的catch没有相应的try。我想知道这种语法是否合法,如果合法,它会产生什么影响 struct foo { void bar() { } catch (...) { } }; int main () { foo f; f.bar(); return 0; } 最初在您给出的示例中看到 struct foo { void bar() { } catch (...)
foo::bar()
中的catch
没有相应的try
。我想知道这种语法是否合法,如果合法,它会产生什么影响
struct foo
{
void bar()
{
}
catch (...)
{
}
};
int main ()
{
foo f;
f.bar();
return 0;
}
最初在您给出的示例中看到
struct foo
{
void bar()
{
}
catch (...)
{
}
};
…不是有效的标准C++。 它可能是一个g++语言扩展
< > >代码> catch >代码> ES,在链接到类似函数的catch块的问题上,除了需要“<代码>尝试< /COD>关键字”。
其他人很快指出,引用的代码不是很好的C++。由于在最近的GCC 4/5/6分支中使用的改写C++分析器,它被允许通过。 我把这件事登记在案。如图所示,刚刚对所有3个分支进行了提交,以确保只有在遇到匹配的函数-
try
块时才会接受函数-catch
块。三天的转机,很好:-)
感谢Richard提出这个问题 呃。。。我真的看不出你在这里问的问题在你链接到的原始问题的答案中还没有涵盖。是的,“不会”指的是未来。这个问题还没有回答。如果不包括你在这里提出的问题,我看不出这个问题是如何回答的。不是用clang 3.8.0编译的。我甚至不知道gcc是如何编译的,因为我只是浏览了一下标准语法。我只能猜测这是
g++
解析中的一个漏洞,catch
不需要相应的函数作用域try
,即使没有它是完全无用的,而且(出于同样的原因)标准似乎明确要求两者。如果是这样的话,我肯定会建议你把这个提交给他们的Bugzilla:[夸张地叹息]好吧,我会这么做:fwiw,用g++-std=c++14-Wall-Wextra-Wpedantic
为我编译,我希望它能关闭所有愚蠢的专有扩展g++
允许在bar()之间定义其他东西
和catch
也一样,没有生成任何语法错误或警告,但是当然,catch
没有try
,实际上不会捕获任何内容,而且它必须位于所述try
包含其范围的函数的正下方。我猜这是解析中的一个漏洞,catch
不需要相应的函数作用域try