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

c++ - 如何在 Visual Studio 中处理 noexcept

我正在尝试创建一个派生自std::exception并覆盖的自定义异常what()。一开始,我是这样写的:

这在 VS2012 中工作正常,但它不能在 GCC 4.8 中编译-std=c++11

错误:'virtual const char* UserException::what() const'的更宽松的抛出说明符</p>

所以我补充说noexcept

这在 GCC 中运行良好,但在 Visual Studio 中无法编译(因为 VS 2012 不支持noexcept):

错误 C3646:“noexcept”:未知覆盖说明符

处理此问题的推荐方法是什么?我希望使用两个编译器编译相同的代码,并且我正在使用 C++11 功能,所以我不能使用不同的-std.

0 投票
2 回答
3189 浏览

c++ - 我可以强制默认的特殊成员函数为 noexcept 吗?

由于我已将移动赋值运算符声明为,以下结构无法在 C++11 下编译noexcept

编译器生成的默认移动赋值运算符是noexcept(false)因为它std::vector<int>的移动赋值也是noexcept(false)。这又是由于默认分配器已std::allocator_traits<T>:: propagate_on_container_move_assignment设置为std::false_type. 另请参阅此问题

我相信这已在 C++14 中得到修复(请参阅库缺陷 2103)。

我的问题是,有没有办法让我强制noexcept使用默认的移动赋值赋值运算符而不必自己定义它?

如果这是不可能的,有没有办法可以欺骗std::vector<int>移动noexcept分配,以便noexcept(true)传递给我的结构?

0 投票
2 回答
1437 浏览

c++ - 如何在具有复制和交换习语的赋值运算符中使用 noexcept?

移动赋值运算符通常应声明为 noexcept(即,将类型存储在 STL 容器中)。但是复制和交换习惯用法允许在单个代码中定义复制和移动赋值运算符。在这种情况下如何处理 noexcept 说明符?复制构造可以抛出,但我怀疑它是否会违反 noexcept 说明符。

0 投票
1 回答
880 浏览

c++ - noexcept 依赖于成员函数的 noexcept

考虑:

海湾合作委员会说不:

相似地:

这是符合标准的预期行为,还是 GCC (4.8.0) 中的错误?

0 投票
1 回答
671 浏览

c++ - 为什么std智能指针类型析构函数不继承指向对象的noexcept dtor状态

在 C++11 中,我的理解是默认析构函数是隐式的noexcept(true),除了:

如果我有一个C具有显式标记的析构函数的类noexcept(false)(可能是因为它出于某种奇怪的原因而抛出,并且我知道您不应该这样做,以及为什么),那么任何派生自C或包含类型成员的类的析构函数C也变成了noexcept(false)

但是,包含 a 的类std::shared_ptr<C>显然不会自动将其析构函数切换为,包含 a ,等noexcept(false)也是如此。std::weak_ptr<C>std::unique_ptr<C>

这是一个完整的例子:

F 和 H 失败对我来说似乎很奇怪。我曾期望拥有/引用类型的析构函数的 noexcept 状态会传播到智能指针析构函数,大概是通过noexcept(std::is_nothrow_destructible<T>::value)智能指针析构函数声明中的 noexcept 表达式。

但是标准没有提到这一点,我看过的标准库代码也没有这样做。

有谁知道为什么标准智能指针不将实例化类型的 noexcept 析构函数状态传播到智能指针析构函数?

0 投票
1 回答
866 浏览

c++ - std::move_if_noexcept 的基本原理仍在移动投掷仅移动类型?

move_if_noexcept将要:

  • 返回一个右值——促进移动——如果移动构造函数是noexcept 或者如果没有复制构造函数(仅移动类型)
  • 返回一个左值——强制复制——否则

我发现这相当令人惊讶,因为具有抛出 move-ctor 的仅移动类型仍将由使用move_if_noexcept.

是否对此给出了详尽的理由?(也许直接或在N2983的行之间?)

不编译代码而不是仍然不得不面对不可恢复的移动场景不是更好吗?vectorN2983 中给出的示例很好:

标记行中给出的注释实际上是错误的 - 对于可以引发移动构造的仅移动类型,当我们将旧元素移动到它们的新位置时, - 可能失败 - 不可逆的突变实际上已经开始。

简单地看一下,我会说只能投掷的类型不能放入向量中,但也许不应该?

0 投票
3 回答
4567 浏览

c++ - 为什么向量访问运算符没有指定为 noexcept?

为什么std::vectoroperator[]成员函数没有指定front为?backnoexcept

0 投票
2 回答
5594 浏览

c++ - 在函数声明和定义中使用 noexcept 说明符?

考虑以下函数:

noexcept如果类型T不可构造,我想创建这个函数。

怎么做 ?(我的意思是语法是什么?)

0 投票
1 回答
2683 浏览

c++ - 函数声明后的 C++ throw() (_NOEXCEPT)

我在 Visual C++ 包含文件中看到<vector>使用throw()after 函数:

使用_NOEXCEPT宏 for throw(),所以上面看起来像:

但是投掷有什么作用呢?我在这个问题中看到了为什么这是一种不好的做法,但是为什么在没有抛出或捕获任何东西的情况下将其放在那里?

0 投票
1 回答
312 浏览

c++ - 当用作类型或异常规范时,“见下文”是什么意思?

浏览 C++ 标准(当前草案http://isocpp.org/files/papers/N3690.pdf,第 20.8.3 节就是这样一个地方)并通过 LLVM 的 libc++ 标头,我发现“见下文”用作类型和异常规范。它似乎在不存在类型时使用,但使用 2 个单词的短语而不是某种有效的标识符似乎很奇怪。

它是在标准中的某个地方还是在其他地方讨论过?为什么/如何使用它?