问题标签 [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 规范
用g++ 4.9和clang 3.4测试,为什么这段代码编译不出来:
但是这段代码确实:
f_helper 函数不必定义,它只需要在这种情况下通过 decltype 指定正确的返回类型。
第一个代码也为 1 个或 2 个参数编译,但是一旦我尝试用 3 个或更多参数调用它,我就会收到关于没有匹配函数要调用的错误。第一个代码的clang错误是:
c++ - 如果对象的构造函数是 noexcept,placement new (expression) 可以抛出吗?
如果分配失败或构造失败, Normal new
可以抛出(如果有其他情况,请纠正我),但由于放置 new 不分配任何空间,如果构造函数T
不抛出,新表达式可以抛出吗?
即以下noexcept
规范是否正确和安全?
c++ - C++ 标准是否要求 C 链接函数是“noexcept”?
我在标准中找不到任何强制声明为的函数的内容extern "C"
,noexcept
无论是隐式还是显式。
然而,应该清楚的是 C 调用约定不能支持异常......或者是吗?
标准是否在我错过的地方提到了这一点?如果不是,为什么不呢?它只是作为某种实现细节而留下吗?
c++ - 析构函数的向后兼容 noexcept(false)
最多 C++03 的析构函数通常被允许抛出任意异常。
然而,在 C++11 中,所有没有显式异常规范的析构函数都成为noexcept
默认值。这可以被覆盖,noexcept(false)
但此代码不会被 C++11 之前的编译器接受。
noexcept(false)
一种解决方案是通过检查特定于编译器的s来检测需要#define
,但这仍然限制了此类代码对一组已知编译器的适用性。
是否有任何可移植的方式允许在С++11和C++03中从析构函数中抛出任意异常?
c++ - 为什么在 C++11/14 中没有 std::move_if_noexcept 对应的 std::forward?
我看过 Scott Meyers 在 GoingNative2013 “An Effective C++11/14 Sampler”上的演讲,他解释了std::move_if_noexcept
.
所以在我看来,应该有一个std::forward_if_noexcept
也保证异常安全的forward
?为什么标准库中没有这样的东西?还有另一种可能来保证吗?
c++11 - C++ 11 静态断言无法使用 Clang++ 进行 noexcept 检查?
我正在尝试编译以下代码,clang++ -std=c++11 -c
但它失败了:
Clang 3.4.2 给我的错误消息是:
我在这里想念什么?
c++ - noexcept,堆栈展开和性能
以下来自 Scott Meyers 新 C++11 书的草稿说(第 2 页,第 7-21 行)
展开调用堆栈和可能展开它之间的区别对代码生成有惊人的巨大影响。在 noexcept 函数中,如果异常会传播到函数之外,优化器不需要将运行时堆栈保持在不可回退状态,也不必确保在异常离开函数时以相反的构造顺序销毁 noexcept 函数中的对象. 结果是更多的优化机会,不仅在 noexcept 函数的主体内,而且在调用该函数的位置。这种灵活性只存在于 noexcept 函数中。具有“throw()”异常规范的函数缺少它,根本没有异常规范的函数也是如此。
相比之下,“C++ 性能技术报告”部分5.4
描述了实现异常处理的“代码”和“表格”方式。特别是,“table”方法在没有抛出异常时没有时间开销,只有空间开销。
我的问题是——Scott Meyers 在谈到展开与可能展开时所谈论的优化是什么?为什么这些优化不适用throw()
?他的评论是否仅适用于 2006 TR 中提到的“代码”方法?
c++ - 为什么 std::vector 尽管声明为 noexcept(false) 却使用移动构造函数
无论我在互联网上的何处阅读,强烈建议如果我希望我的类能够很好地工作std::vector
(即我的类中的移动语义被使用std::vector
),我应该将移动构造函数称为“noexcept”(或noexcept(true)
)。
std::vector
即使我将其标记noexcept(false)
为实验,为什么还要使用它?
输出:
为什么 ?我做错了什么 ?
在 gcc 4.8.2 上编译,CXX_FLAGS 设置为:
c++ - 功能尝试块和 noexcept
对于以下代码
Visual Studio 14 CTP 发出警告
警告 C4297:“X::X”:假定函数不会引发异常,但会引发异常
注意:函数上指定了 __declspec(nothrow)、throw()、noexcept(true) 或 noexcept
这是滥用noexcept
吗?或者它是微软编译器中的一个错误?
c++ - 如果类型为 noexcept,C++ 11 STL 中的哪些算法和容器可以运行得更快?
关于使用 noexcept 有多少关心的争论在工作中出现了。我们都知道 noexcept 并没有真正为编译器的优化器做很多事情,除了编译器必须假设的外部定义的代码可能会抛出,因为它不知道它的实现,所以标记事物的唯一真正的其他性能优势noexcept 用于使用std::move_if_noexcept<>的代码,假设它主要是 STL 容器及其算法。
因此评估是这样的:不要使用noexcept,除非:
编译器不知道可调用的实现的外部函数和类。
移动构造函数、移动赋值运算符并交换任何可能包含在 STL 容器中的类型。
否则不要担心。
这是一个公平的评价吗?如果某些东西不是例外,STL 中是否还有其他地方可以生成更优化的代码?如果是这样,这是哪个 STL 实现,需要将什么标记为 noexcept 才能使其工作,以及带来哪些性能优势(更少的内存分配,更低的复杂性)?
编辑:将 CashCow 的建议更改为措辞。