C++ 这是不是编译错误typedefint(*j)()抛出(A)? #包括 A类{}; typedef int(*j)()投掷(A); int f() { 我知道这不是这个问题的答案-
MSVC2010(我有)没有抛出任何错误,编译良好,工作正常 G++(GNU)说C++ 这是不是编译错误typedefint(*j)()抛出(A)? #包括 A类{}; typedef int(*j)()投掷(A); int f() { 我知道这不是这个问题的答案-,c++,visual-studio-2012,typedef,C++,Visual Studio 2012,Typedef,MSVC2010(我有)没有抛出任何错误,编译良好,工作正常 G++(GNU)说错误:“j”用异常规范声明 Clang说错误:typedefs中不允许使用异常规范 底线:MSVC中的编译器错误。异常规范不是函数类型的一部分。例如,您不能在其上重载;并且指向函数的指针不包含异常规范。正如@Aniket所说,他们的编译器接受该声明是Microsoft的错误。哪个编译器和哪个版本?Microsoft visual studio 2012因为您声称将在foo()的原型中抛出typename a对象,而实
错误:“j”用异常规范声明
Clang说错误:typedefs中不允许使用异常规范
底线:MSVC中的编译器错误。异常规范不是函数类型的一部分。例如,您不能在其上重载;并且指向函数的指针不包含异常规范。正如@Aniket所说,他们的编译器接受该声明是Microsoft的错误。哪个编译器和哪个版本?Microsoft visual studio 2012因为您声称将在foo()
的原型中抛出typename a
对象,而实际上尚未声明它,所以我看不出它怎么不是编译器错误。您应该为a
或“预期”)获得一个未定义的符号。”错误。这可能是一个编译器错误MSVC是垃圾,我已经告诉过你了…叮当声抛出baz.cpp:8:20:错误:typedefs中不允许使用异常规范这不是MSVC错误。MSVC故意选择忽略大多数异常规范:仅throw()有一个效果。他们的语法分析器仍然必须接受它们,显然它太过接受它们。参见@ Sjoerd——故意的或其他的,这是一个错误。编译器没有正确地执行C++标准。任何偏离标准的都是bug @ Sjordd DelBror或其他;而且关于链接@ SJeRD微软有着悠久的历史。将bug作为特性进行投影!从一家“销售”其开发工具的公司来说,这并不是什么新鲜事。扩展不是偏离标准的。如果标准不需要诊断,编译器是完全符合的。
#include <iostream>
class A {};
typedef int (*j)() throw(A);
int f()
{
std::cout << "function f" << std::endl;
return 0;
}
int main()
{
j y = f;
y();
}