问题标签 [noexcept]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Noexcept 说明符:为什么没有编译时检查?
我正在研究说明noexcept
符,我想知道它的一些设计决策背后的原因。特别是,它不进行与例如说明constexpr
符相同的编译时间检查的原因。我稍后会解释这个断言。
这是我正在测试的代码:
此版本的代码编译但崩溃,因为(如果我理解得很好)noexcept
编译器只是“信任我”并进行了优化,不允许运行时的代码处理任何异常,尽管try
/catch
堵塞。
我不明白的是:为什么编译器不检查像签名这样简单的东西g()
?g()
尚未声明noexcept
,因此无需进行昂贵的检查是否真的抛出,代码应该被认为是错误的,因为g()
是隐含的noexcept(false)
。这在什么情况下有用?
要按照我个人的预期工作,我必须更改如下签名f()
:
现在,声明上的noexcept
说明f()
符仅在它也出现在声明中时才g()
适用。在运行时,异常得到完美处理。为什么这不是默认值?如果f()
调用了很多函数,noexcept(noexcept(g()))
手动为每个调用的函数做一个维护地狱。
我引用了constexpr
说明符,因为它实际上使编译器检查该函数调用的所有这些函数constexpr
本身是否声明为constexpr
. 所以,我认为为什么noexcept
不这样做的原因与编译时间有关。
总结问题:为什么编译器不检查函数调用的noexcept
函数本身是否声明为noexcept
?
c++ - 为什么这段代码会出现“异常规范比基础更宽松”错误?
尝试使用 Xcode 6.1 中的 clang 版本(基于 LLVM 3.5svn 的 clang-600.0.54)编译以下代码,-std=c++11
并-stdlib=libc++
给出了一些我不太理解的错误。
结果:
看起来好像Impl::L::~L()
以某种方式继承了noexcept(false)
of Hndl::~Hndl()
,但我不知道为什么。有趣的是,如果我注释掉h.impl->i
lambda 内部的赋值,同样的代码也会编译。如果我从中删除noexcept(false)
规范,也会编译Hndl::~Hndl()
,但我需要它(解释原因会有点长,但我这样做了)。如果 lambda 通过 ref 捕获,也会编译,但这里的重点是能够复制共享实现的句柄。添加noexcept(true)
到Impl::~Impl()
没有帮助。
ideone.com 的 c++11 编译器很高兴地按原样编译它。
谁能解释一下这里发生了什么?
c++ - 为什么交换多维数组不是noexcept?
我有以下片段:
使用 GCC 4.9.0,这将打印0
. 我不明白为什么。
根据标准,有两个重载std::swap
:
据我了解,数组的noexcept
说明符应该递归地用于多维数组。
为什么不交换多维数组noexcept
?
在试图找到一个仍然行为怪异的最小示例时,我想出了以下内容:
使用 GCC 4.9.0 打印1 1 0
,但我还是不明白为什么。
c++11 - 当我可能从 `noexcept` 析构函数中抛出异常时,Clang 可以警告我吗?
C++11 默认指定析构函数noexcept
。有没有办法让 Clang 报告我的noexcept
析构函数可能抛出异常(并因此调用std::terminate
)的情况?
c++ - noexcept 取决于成员的方法
与这个问题相关,我想在我的公共界面之后指定我的私人部分。
但是我从 Clang 得到一个错误,即 x 是一个未声明的标识符。
如果成员 x 的声明发生在 g 的声明之前,它编译得很好。我不应该能够在类定义中的 noexcept 运算符中使用成员变量而不是其声明吗?如果不是,我如何在不提前声明 x 的情况下实现等效的 noexcept 说明符?
c++ - noexcept 有什么用?
我看到C++ 11添加了noexcept
关键字。但我真的不明白为什么它有用。
如果函数在不应该抛出的时候抛出 - 我为什么要让程序崩溃?
那么我应该什么时候使用它呢?
此外,它如何与使用 /Eha 编译和使用一起工作_set_se_translator
?这意味着任何代码行都可以抛出 c++ 异常——因为它可能会抛出 SEH 异常(因为访问受保护的内存)并且它将被转换为 c++ 异常。
那时会发生什么?
c++ - 如何创建 noexcept 函数指针?
我想创建一个这样的函数指针:
但是,这行不通。函数声明中的异常说明符似乎无效。不过,必须有办法做到这一点。正确的?
这与一个与此不同的问题有关。在这里,我要问如何使用 noexcept 说明符创建函数指针。在“函数typedefs中的noexcept说明符”问题中没有提出或回答。
c++ - 如何为 noexcept 函数指针创建别名?
我想这样做:
但我收到一个错误“类型别名中不允许异常规范”。(Xcode 6.1 版本中的 clang)
是否有一种解决方法可以使用 noexcept 说明符创建别名?
我正在寻找跨平台功能的语言(不是扩展)定义的东西。
c++ - 可能带有 noexcept 和模板的 g++ 错误
当我将模板与说明符一起使用时,我收到关于不匹配的 noexcept 规范的错误noexcept
。它可以使用我使用过的各种版本的 clang 进行编译,但在所有版本的 gcc 中都失败了。
错误:
这是一个错误吗?有没有办法绕过它?
templates - VS2015-preview:noexcept 表达式评估失败
我在 VS2015 预览版中尝试代码时遇到了这个问题。看来 MSVC 在评估 noexcept 表达式时遇到问题,并导致以下错误消息。我通过将 noexcept 表达式提升到将结果传递给继承的 integer_constant 的包装结构中解决了这个问题。
我进行了一些搜索,但找不到任何将其记录为 MSVC 问题的内容。我非常有信心这是可移植的代码,因为 libc++ 将这种模式用于其 type_traits 实现。MSVC 使用编译器内在实现了他们的 type_trait 版本。
好奇在我向 Microsoft 记录错误之前是否有人有任何见解。
- 查看更多信息:http: //ideone.com/3ggm0E#sthash.Drpe1SbD.dpuf
GCC 4.9 作品:http: //ideone.com/3ggm0E
MSVC:使用 /EHsc /nologo /W4 /c main.cpp main.cpp(7) 编译:错误 C2143:语法错误:在 '...' main.cpp(8) 之前缺少 ')':注意:请参阅参考类模板实例化 'is_nothrow_constructible_custom' 正在编译 main.cpp(7): 错误 C2947: 期望 '>' 终止模板参数列表,发现 '>' main.cpp(7): 错误 C2976: 'std::integral_constant' : 模板参数太少 c:\tools_root\cl\inc\xtr1common(34): 注意: 见 'std::integral_constant' main.cpp(8) 的声明: 错误 C2955: 'std::integral_constant': 使用类模板需要模板参数列表 c:\tools_root\cl\inc\xtr1common(34):注意:参见“std::integral_constant”的声明