问题标签 [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(false) 时,标准库必须调用复制构造函数而不是移动构造函数似乎是一致的。
现在我不明白为什么会这样。而且更多的 Visual Studio VC v140 和 gcc v 4.9.2 似乎以不同的方式做到了这一点。
我不明白为什么 noexcept 这是例如向量的问题。我的意思是如果 T 没有,vector::resize() 应该如何提供强大的异常保证。正如我所看到的,向量的异常级别将取决于 T。无论使用复制还是移动。我理解 noexcept 只是对编译器进行异常处理优化的一个眨眼。
这个小程序在使用 gcc 编译时调用复制构造函数,在使用 Visual Studio 编译时调用移动构造函数。
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>::value
,false
我必须将声明和定义都标记为noexcept
make it true
。
现在我感兴趣的是实际规则是什么。特别是因为Effective Modern C++ (Scott Meyers) 中的第 22 项似乎通过建议实现 pimpl-idiom move 构造函数就像我对Object2
.
c++ - 不变量和无异常
在 C++ 中,如果一个方法可能只是因为没有维护类的不变量而抛出,我应该标记它noexcept
吗?
例如,一个列表有一个指向链接的指针,它应该是nullptr
或正确的指针,并且一个方法取消引用这个指针。它会阻止使用noexcept
吗?
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?
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的复杂代码时遇到了这个问题。在该代码中S
,T
是模板类;所以行为取决于S
实例化的类型。对于某些类型,Clang 会因为此错误而拒绝它,而 g++ 允许它,并且 SFINAE 基于is_constructible
和类似的特征工作。
c++ - 常量表达式中调用的`static constexpr`函数是...错误?
我有以下代码:
我希望因为它foo()
是一个static constexpr
函数,并且由于它是在bar
声明之前定义的,所以这是完全可以接受的。
但是,g++
给了我以下错误:
这……没什么用,因为在常量表达式中调用函数的能力是constexpr
.
clang++
有点帮助。除了指出参数 tonoexcept
必须是常量表达式的错误消息外,它还说:
那么......这是一个两遍编译问题吗?编译器是否试图在定义类中的所有成员函数之前声明它们的问题?(请注意,在类的上下文之外,编译器都不会抛出错误。)这让我感到惊讶;直观地说,我看不出有任何理由让static constexpr
成员函数不能在类内部或外部的任何和所有常量表达式中使用。
c++ - C++11,`noexcept` 说明符,定义与声明
如果一个声明的函数有一个noexcept
说明符(noexcept
, noexcept(true)
,noexcept(false)
或任何其他noexcept(expr)
计算结果为true
or false
),但它是在另一个地方定义的,我需要noexcept
在定义中再次指定说明符,还是只在其前向声明中指定说明符?
c++ - C++省略`noexcept`说明符与`noexcept(false)`,它们的确切含义是什么?
如果我将函数标记为noexcept(false)
,或任何其他计算结果为假的表达式,这意味着什么?(1)我是否向编译器确保该函数可以抛出异常?,(2)或者我是否确保它是否可以抛出异常?
最后,如果我省略说明noexcept
符,它等同于noexcept(false)
,还是仅等同于上述 (2)nd 含义?
c++ - 如何在类noexcept之外定义默认构造函数?
我知道标记为的构造函数将尽可能=default
“尝试” noexcept
。但是,如果我在类之外定义它,它就不再是noexcept
了,正如您从这段代码中看到的那样:
如何=default
在类之外定义这样的构造函数并制作它noexcept
?如果在类之外定义,为什么会有这样的构造函数noexcept(false)
?通过智能指针实现PIMPL时会出现此问题。
c++ - C++ noexcept 用于不抛出异常但可能导致内存故障的函数
例如,有两种不同的方法来访问私有数组的元素,重载数组下标运算符或定义at
:
at
版本可以抛出异常,但数组下标运算符不能。
我的问题是,尽管operator[]
不会引发异常,是否可以将其标记为noexcept
即使知道它可以引发 SIGSEGV 信号,还是只是一种不好的做法?
我想指出一个信号(如 SIGSEGV)也不例外。作为字面意思的解释noexcept
,一个noexcept
函数是一个声称它不会抛出异常的函数。它没有说明其他任何事情(包括信号)。
但是,noexcept
函数的意义远不止于此,至少对于我的代码的客户而言。noexcept
还隐含地表示该函数是安全的,它将在没有计算错误的情况下完成其执行。
那么,标记noexcept
一个不安全的功能是不合适的吗?