问题标签 [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.

0 投票
0 回答
103 浏览

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

0 投票
3 回答
4714 浏览

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->ilambda 内部的赋值,同样的代码也会编译。如果我从中删除noexcept(false)规范,也会编译Hndl::~Hndl(),但我需要它(解释原因会有点长,但我这样做了)。如果 lambda 通过 ref 捕获,也会编译,但这里的重点是能够复制共享实现的句柄。添加noexcept(true)Impl::~Impl()没有帮助。

ideone.com 的 c++11 编译器很高兴地按原样编译它。

谁能解释一下这里发生了什么?

0 投票
1 回答
651 浏览

c++ - 为什么交换多维数组不是noexcept?

我有以下片段:

使用 GCC 4.9.0,这将打印0. 我不明白为什么。

根据标准,有两个重载std::swap

据我了解,数组的noexcept说明符应该递归地用于多维数组。

为什么不交换多维数组noexcept


在试图找到一个仍然行为怪异的最小示例时,我想出了以下内容:

使用 GCC 4.9.0 打印1 1 0,但我还是不明白为什么。

0 投票
1 回答
625 浏览

c++11 - 当我可能从 `noexcept` 析构函数中抛出异常时,Clang 可以警告我吗?

C++11 默认指定析构函数noexcept。有没有办法让 Clang 报告我的noexcept析构函数可能抛出异常(并因此调用std::terminate)的情况?

0 投票
0 回答
378 浏览

c++ - noexcept 取决于成员的方法

这个问题相关,我想在我的公共界面之后指定我的私人部分。

但是我从 Clang 得到一个错误,即 x 是一个未声明的标识符。

如果成员 x 的声明发生在 g 的声明之前,它编译得很好。我不应该能够在类定义中的 noexcept 运算符中使用成员变量而不是其声明吗?如果不是,我如何在不提前声明 x 的情况下实现等效的 noexcept 说明符?

0 投票
2 回答
5707 浏览

c++ - noexcept 有什么用?

我看到C++ 11添加了noexcept关键字。但我真的不明白为什么它有用。

如果函数在不应该抛出的时候抛出 - 我为什么要让程序崩溃?

那么我应该什么时候使用它呢?

此外,它如何与使用 /Eha 编译和使用一起工作_set_se_translator?这意味着任何代码行都可以抛出 c++ 异常——因为它可能会抛出 SEH 异常(因为访问受保护的内存)并且它将被转换为 c++ 异常。

那时会发生什么?

0 投票
1 回答
464 浏览

c++ - 如何创建 noexcept 函数指针?

我想创建一个这样的函数指针:

但是,这行不通。函数声明中的异常说明符似乎无效。不过,必须有办法做到这一点。正确的?

这与一个与此不同的问题有关。在这里,我要问如何使用 noexcept 说明符创建函数指针。在“函数typedefs中的noexcept说明符”问题中没有提出或回答。

0 投票
4 回答
2150 浏览

c++ - 如何为 noexcept 函数指针创建别名?

我想这样做:

但我收到一个错误“类型别名中不允许异常规范”。(Xcode 6.1 版本中的 clang)

是否有一种解决方法可以使用 noexcept 说明符创建别名?

我正在寻找跨平台功能的语言(不是扩展)定义的东西。

0 投票
1 回答
183 浏览

c++ - 可能带有 noexcept 和模板的 g++ 错误

当我将模板与说明符一起使用时,我收到关于不匹配的 noexcept 规范的错误noexcept。它可以使用我使用过的各种版本的 clang 进行编译,但在所有版本的 gcc 中都失败了。

错误:

这是一个错误吗?有没有办法绕过它?

0 投票
0 回答
317 浏览

templates - VS2015-preview:noexcept 表达式评估失败

我在 VS2015 预览版中尝试代码时遇到了这个问题。看来 MSVC 在评估 noexcept 表达式时遇到问题,并导致以下错误消息。我通过将 noexcept 表达式提升到将结果传递给继承的 integer_constant 的包装结构中解决了这个问题。

我进行了一些搜索,但找不到任何将其记录为 MSVC 问题的内容。我非常有信心这是可移植的代码,因为 libc++ 将这种模式用于其 type_traits 实现。MSVC 使用编译器内在实现了他们的 type_trait 版本。

好奇在我向 Microsoft 记录错误之前是否有人有任何见解。

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”的声明