noexcept相关内容
根据[string.find#1.2]和[string.find#1.3]: 表单的每个成员函数 constexpr size_type F(const charT* s, size_type pos) const; 的效果相当于:return F(basic_string_view(s), pos); 表单的每个成员函数 const
..
为什么没有指定std::vector的operator[]、front和back成员函数作为 noexcept? 解决方案 noexcept 标准的政策是只标记不能或不能 失败,但不是那些简单指定不抛出异常的.换句话说,所有具有有限域的函数(传递错误的参数,你会得到未定义的行为)都不是 noexcept,即使它们没有被指定为抛出. 被标记的函数是诸如 swap(不能失败,因为异常安全
..
throw() 和 noexcept 除了分别在运行时和编译时检查之外,还有什么区别吗? 这篇维基百科 C++11 文章表明 C++03 抛出说明符已弃用. 为什么是这样,noexcept 是否足以在编译时涵盖所有这些内容? [注意:我检查了这个问题和这篇文章,但无法确定弃用的确切原因.] 解决方案 异常说明符已被弃用,因为异常说明符通常是一个糟糕的主意.添加 noexcep
..
noexcept 关键字可以适当地应用于许多函数签名,但我不确定何时应该考虑在实践中使用它.根据我目前所读到的内容,最后一分钟添加的 noexcept 似乎解决了移动构造函数抛出时出现的一些重要问题.但是,对于一些实际问题,我仍然无法提供令人满意的答案,这些问题使我首先阅读了有关 noexcept 的更多信息. 有很多我知道永远不会抛出的函数示例,但编译器无法自行确定.在所有这些情况下,我应
..
我问的是一个(流行的)问题的变体 - 检测类的方法的存在. 我在这里阅读了很多答案,大多数(C++17 后)解决方案看起来像 这个: #include 模板结构空洞{使用类型 = 无效;};模板结构 has_foo : std::false_type{};模板struct has_foo().foo())>::type>:std::true_type{}; 基本上,我们让编译器决定使用“
..
假设我具有此功能 void foo()noexcept{//安全地使用noexcept代码.} 然后是此类: 类栏{Bar(const Bar&){...}//不是,所以可能会抛出//不可移动:Bar(Bar&)=删除;}; 现在,我需要修改foo()才能按值接收Bar: void foo(Bar bar)//没有例外?{//安全地使用noexcept代码} 我假设Bar的复
..
我是C ++的初学者,我正在学习某些C ++ 11功能.我注意到的一件事是,在Visual C ++ stdlib的某些部分中,作者使用了 _NOEXCEPT 宏而不是 noexcept 关键字.将鼠标悬停在宏上说 #define _NOEXCEPT noexcept ,所以我有点困惑它的意义是什么.两者之间有什么区别,我应该优先选择另一个吗? 编辑:我刚刚在GitHub上搜索了它,看起来像
..
斯科特·迈耶斯(Scott Meyers)说,在更有效的C ++ 中 C ++指定要复制作为异常抛出的对象. 然后我想,如果复制构造函数又抛出一个异常,则会调用 std :: terminate ,因此这是声明我所有异常的复制构造函数的一个很好的理由 noexcept(而且,我猜也不要抛出从堆中分配内存的对象,例如 std :: string ). 但是我很惊讶地看到GCC 4.
..
constexpr 说明符是否暗示函数的 noexcept 说明符?回答到简单检查显示出它的答案.并非如此. constexpr布尔f(int)noexcept{返回true;}constexpr布尔g(int){返回true;}static_assert(noexcept(f(1)));static_assert(noexcept(g(2)));//注释此行以检查运行时行为#include
..
举个例子: double values[] {2.5, -3.5, 4.5, -5.5, 6.5, -7.5}; std::vector squares(std::end(values) - std::begin(values)); std::transform(std::begin(values), std::end(values), std::begin(values)
..
如果您的实现具有零成本(如果未抛出任何异常)异常模型,则 noexcept 说明符是否无用?缺少 noexcept 会导致后果的例子是什么? 解决方案 如果您的实现具有零成本(如果未抛出任何异常)异常模型,则 noexcept 指定符是否无用? 否,即使异常对性能完全没有影响, noexcept 还是有用的。 一个例子是 noexcept 可以表示可以使用哪种算法。例如,使
..
在派生类上使用noexcept说明符时遇到问题,更确切地说,当父级是抽象类(具有protected构造函数)时. 此后是我声明类的示例. 在基类中具有public构造函数:一切正常. 与protected相同的代码,派生的类不再“不可移动". 我想念什么吗? std::is_nothrow_move_constructible是在派生类声明中使用的正确特征还是我应该使用其他东西
..
std::priority_queue的 pop() 方法不是声明为noexcept,因此理论上可能会引发异常.但是它什么时候会引发异常,这些异常又会是什么呢? 解决方案 可以标记为nothrow,但不能标记为 . 为什么std::priority_queue::pop不能 * 不扔 void pop(); 从优先级队列中删除顶部的元素.有效呼叫 std::pop_he
..
C ++ 17使noexcept成为函数类型的一部分.它还允许从noexcept函数指针到潜在抛出函数指针的隐式转换. void (*ptr_to_noexcept)() noexcept = nullptr; void (*ptr_to_throwing)() = ptr_to_noexcept; // implicit conversion http://eel.is/c++dra
..
考虑以下功能: // Declaration in the .h file class MyClass { template void function(T&& x) const; }; // Definition in the .cpp file template void MyClass::function(T&& x) const;
..
有问题的代码是 #include #include template void for_each(F&&) noexcept {} template void for_each(F&& f, T&& v, Us&&... us) {
..
在C ++中,noexcept如何更改程序集?我在Godbolt中尝试了一些小的功能,但是 float pi() //noexcept // no difference { return 3.14; } int main(){ float b{0}; b = pi(); return 0; } 我正在寻找一个最小的工作示例,在其中我可以看到由于noexcept而导致的装配更改. 解决方
..
"Effective Modern C ++"的项目14建议在不发出异常的情况下声明函数noexcept.我有一类具有许多小型成员函数的类,这些函数由于非常琐碎的原因而无法抛出异常,例如他们只对POD执行简单的数学运算.我应该声明这样的功能noexcept吗?对我来说,即使编译器也可以肯定地检测到没有抛出的可能性,这似乎太过致命了. 编辑:为了稍微澄清我的问题,在此中给出的建议问题是“在很明
..
最近在我的代码中,我已经在我知道确实会引发异常的函数上显式编写noexcept(false),主要是供那些阅读代码的人使用.但是,我想知道这是否影响我的代码的行为或编译器解释它的方式.有什么区别吗? 注意:我知道析构函数是隐式的noexcept,并且您必须指定noexcept(false)来进行更改,我想知道其他函数. 解决方案 没有异常说明符,并且明确声明noexcept(fals
..
在C ++ 17中noexcept 已添加到类型系统: void r1( void (*f)() noexcept ) { f(); } void foo() { throw 1; } int main() { r1(foo); } 在C ++ 17模式下,最新版本的GCC和Clang拒绝调用r1(foo),因为不能将void (*)()隐式转换为void (*)() noex
..