完全禁止 ˋtypedefˋ 中的异常规范或仅在顶层指定
Exception specification in ˋtypedefˋ completely forbidden or only at toplevel?
在 C++14 秒 15.4;2 中指出,...异常规范不得出现在 typedef 声明或别名声明中。
这意味着禁止以下行为:
typedef void (*fn)(int) noexcept;
但是措辞不应该出现是否意味着令牌noexcept
不能出现在typedef声明中的任何位置?
例如,这两者都是被禁止的吗?
typedef void (*fn1)(void (*)(int) noexcept);
typedef decltype(std::declval<void (*)(int)noexcept>()) fn2;
它们都试图定义一个类型fn1
,fn2
能够指向一个函数,该函数将指针指向一个接受int
的函数,同时承诺永远不会引发异常。
因此,在我的示例中,异常规范不适用于顶级类型fn1
resp。 fn2
由typedef
引入,但这些函数可能收到的参数。
那么我应该逐字记录 15.4;2 因此我的两个示例都是无效的吗?还是只禁止应用于类型定义,而我的示例是正确的?
这是整个事情。
引用C++11和C++14中[except.spec]/p2
的完整措辞:
异常规范应仅出现在函数类型的函数声明符、指向函数类型的指针、对函数类型的引用或指向作为声明或定义的顶级类型的成员函数类型的指针上,或者出现在函数声明符中显示为参数或返回类型的此类类型上。异常规范不得出现在 typedef 声明或别名声明中。
也许这并不完全清楚,但我认为已经足够了:你可以在函数声明上使用异常规范,包括在函数声明的参数或返回类型中......但不能在别名声明中使用。
该措辞已在C++17中完全删除; noexcept
现在是类型系统的一部分。
相关文章:
- C++:TypeDef使用元组
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 为什么在使用typedef时类推导指南会失败
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- typedef 枚举和枚举类有什么区别?
- ISO C++禁止声明没有类型的"setInputNombre"
- 禁止显示由于常量为零而比较始终为假的警告
- 在类模板中使用 typedef 时出错
- 模板类中的 typedef 语句
- 禁止在控制台上记录谷神星
- 禁止显示有关包含文件中 #pragma 包的警告
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 禁止指针和整数之间的比较C++
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- 向前声明指向类的 typedef 指针
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 完全禁止 ˋtypedefˋ 中的异常规范或仅在顶层指定