问题标签 [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 投票
2 回答
10406 浏览

c++ - Noexcept 和复制、移动构造函数

在我看来,当移动构造函数为 noexcept(false) 时,标准库必须调用复制构造函数而不是移动构造函数似乎是一致的。

现在我不明白为什么会这样。而且更多的 Visual Studio VC v140 和 gcc v 4.9.2 似乎以不同的方式做到了这一点。

我不明白为什么 noexcept 这是例如向量的问题。我的意思是如果 T 没有,vector::resize() 应该如何提供强大的异常保证。正如我所看到的,向量的异常级别将取决于 T。无论使用复制还是移动。我理解 noexcept 只是对编译器进行异常处理优化的一个眨眼。

这个小程序在使用 gcc 编译时调用复制构造函数,在使用 Visual Studio 编译时调用移动构造函数。

0 投票
1 回答
1913 浏览

c++ - 默认定义的移动构造函数上的 noexcept 规则是什么?

尤其是在可能的情况std::vector下,类型noexcept可移动是很重要的。

所以当声明一个移动构造函数= default

std::is_nothrow_move_constructible<Object1>::value将是true因为每个成员(此处为 0)Object1是 nothrow-move-constructible,此处已回答。

然而,如果只声明移动复制构造函数,然后= default像下面的代码那样定义,会发生什么?

使用 g++ 4.9.2 std::is_nothrow_move_constructible<Object2>::valuefalse我必须将声明和定义都标记为noexceptmake it true

现在我感兴趣的是实际规则是什么。特别是因为Effective Modern C++ (Scott Meyers) 中的第 22 项似乎通过建议实现 pimpl-idiom move 构造函数就像我对Object2.

0 投票
3 回答
271 浏览

c++ - 不变量和无异常

在 C++ 中,如果一个方法可能只是因为没有维护类的不变量而抛出,我应该标记它noexcept吗?

例如,一个列表有一个指向链接的指针,它应该是nullptr或正确的指针,并且一个方法取消引用这个指针。它会阻止使用noexcept吗?

0 投票
2 回答
2096 浏览

c++ - Can a function marked as noexcept have exceptions inside?

Let's say that I have a function marked as noexcept but there's a line of code inside that can throw. That line of code will be in a try block and the exception will be caught. Does that cause anything?

0 投票
1 回答
6565 浏览

c++ - gcc接受的带有“noexcept”构造函数的程序,被clang拒绝

编码:

g++ 4.9.2 接受了这一点,没有错误或警告,但是 clang 3.6 和 3.7 报告第 7 行:

但是,如果该行S s;没有被注释掉,g++ 4.9.2 现在会报告:

哪个编译器适合原始代码?


背景:

g++ 甚至允许将以下内容添加到main

哪个输出0。我在使用clang编译一些大量使用模板、SFINAE和noexcept的复杂代码时遇到了这个问题。在该代码中ST是模板类;所以行为取决于S实例化的类型。对于某些类型,Clang 会因为此错误而拒绝它,而 g++ 允许它,并且 SFINAE 基于is_constructible和类似的特征工作。

0 投票
1 回答
6133 浏览

c++ - 常量表达式中调用的`static constexpr`函数是...错误?

我有以下代码:

我希望因为它foo()是一个static constexpr函数,并且由于它是在bar声明之前定义的,所以这是完全可以接受的。

但是,g++给了我以下错误:

这……没什么用,因为在常量表达式中调用函数的能力constexpr.

clang++有点帮助。除了指出参数 tonoexcept必须是常量表达式的错误消息外,它还说:

那么......这是一个两遍编译问题吗?编译器是否试图在定义类中的所有成员函数之前声明它们的问题?(请注意,在类的上下文之外,编译器都不会抛出错误。)这让我感到惊讶;直观地说,我看不出有任何理由让static constexpr成员函数不能在类内部或外部的任何和所有常量表达式中使用。

0 投票
1 回答
2264 浏览

c++ - C++11,`noexcept` 说明符,定义与声明

如果一个声明的函数有一个noexcept说明符(noexcept, noexcept(true),noexcept(false)或任何其他noexcept(expr)计算结果为trueor false),但它是在另一个地方定义的,我需要noexcept在定义中再次指定说明符,还是只在其前向声明中指定说明符?

0 投票
2 回答
1585 浏览

c++ - C++省略`noexcept`说明符与`noexcept(false)`,它们的确切含义是什么?

如果我将函数标记为noexcept(false),或任何其他计算结果为假的表达式,这意味着什么?(1)我是否向编译器确​​保该函数可以抛出异常?,(2)或者我是否确保它是否可以抛出异常?

最后,如果我省略说明noexcept符,它等同于noexcept(false),还是仅等同于上述 (2)nd 含义?

0 投票
2 回答
452 浏览

c++ - 如何在类noexcept之外定义默认构造函数?

我知道标记为的构造函数将尽可能=default“尝试” noexcept。但是,如果我在类之外定义它,它就不再是noexcept了,正如您从这段代码中看到的那样:

如何=default在类之外定义这样的构造函数并制作它noexcept?如果在类之外定义,为什么会有这样的构造函数noexcept(false)?通过智能指针实现PIMPL时会出现此问题。

0 投票
3 回答
1099 浏览

c++ - C++ noexcept 用于不抛出异常但可能导致内存故障的函数

例如,有两种不同的方法来访问私有数组的元素,重载数组下标运算符或定义at

at版本可以抛出异常,但数组下标运算符不能。

我的问题是,尽管operator[]不会引发异常,是否可以将其标记为noexcept即使知道它可以引发 SIGSEGV 信号,还是只是一种不好的做法?

我想指出一个信号(如 SIGSEGV)也不例外。作为字面意思的解释noexcept,一个noexcept函数是一个声称它不会抛出异常的函数。它没有说明其他任何事情(包括信号)。

但是,noexcept函数的意义远不止于此,至少对于我的代码的客户而言。noexcept还隐含地表示该函数是安全的,它将在没有计算错误的情况下完成其执行。

那么,标记noexcept一个不安全的功能是不合适的吗?