该noexcept关键字可以适当地应用于许多功能签名,但我不能确定何时我应该考虑在实践中使用它.根据我到目前为止所读到的内容,最后一分钟的添加noexcept似乎解决了移动构造函数抛出时出现的一些重要问题.但是,我仍然无法对一些实际问题提供令人满意的答案,这些问题使我首先要了解更多信息noexcept.
我知道永远不会抛出许多函数的例子,但编译器无法自行确定.noexcept在所有这些情况下我应该附加到函数声明吗?
不得不考虑我是否需要noexcept在每个函数声明之后追加,这将大大降低程序员的工作效率(坦率地说,这将是一个痛苦的屁股).对于哪些情况,我应该更加小心使用noexcept,以及在哪些情况下我可以使用暗示noexcept(false)?
我何时才能真实地期望在使用后观察到性能提升noexcept?特别是,给出一个代码示例,C++编译器在添加之后能够生成更好的机器代码noexcept.
就个人而言,我关心的是noexcept因为编译器提供了更大的自由来安全地应用某些类型的优化.现代编译器是否noexcept以这种方式利用?如果没有,我可以期待他们中的一些人在不久的将来这样做吗?
在C++中,您可以通过使用异常说明符指定函数可能会也可能不会抛出异常.例如:
void foo() throw(); // guaranteed not to throw an exception
void bar() throw(int); // may throw an exception of type int
void baz() throw(...); // may throw an exception of some unspecified type
Run Code Online (Sandbox Code Playgroud)
由于以下因素,我对实际使用它们表示怀疑:
你认为应该使用异常说明符吗?
请回答"是"或"否"并提供一些理由来证明您的答案.
我正在学习C++,当我尝试创建自己的异常并将它们放在Linux上时,我遇到了这种情况.
我已经创建了一个小测试项目来测试我的实现,下面是我的异常类头文件.
class TestClass : public std::runtime_error
{
public:
TestClass(char const* const message) throw();
virtual char const* what() const throw();
};
Run Code Online (Sandbox Code Playgroud)
异常类的源文件是
using namespace std;
TestClass::TestClass(char const* const message) throw()
: std::runtime_error(message)
{
}
char const * TestClass::what() const throw()
{
return exception::what();
}
Run Code Online (Sandbox Code Playgroud)
在我的主应用程序中,我正在调用一个抛出异常并在try/catch中捕获它的函数,如下所示:
void runAFunctionAndthrow();
/*
*
*/
int main(int argc, char** argv) {
try
{
cout << "About to call function" << endl;
runAFunctionAndthrow();
}
catch (TestClass ex)
{
cout << "Exception Caught: " << ex.what() << …Run Code Online (Sandbox Code Playgroud) 我无法理解noexceptC++ 11/14中in关键字的用法和用途.我的意思是它是那些不发射的功能的签名exceptions.但它真的有效吗?
请看下面的代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void seev (vector<int> &v) noexcept;
void seev (vector<int> &v) noexcept
{
for (int i=0;i<10;++i)
{
cout<<v.at(i)<<' ';
}
}
int main()
{
vector<int> v {1,2,3,4,5};
seev(v);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码肯定会抛出一个out_of_range exception.所以noexcept这里的使用是没用的,或者是吗?
我的疑问是:
noexcept工作怎么样?
怎么用?
什么throw()不能做到这noexcept一点?
我必须测试一个提供自己的内存分配例程的库:
void* allocation_routine(size_t size) throw();
Run Code Online (Sandbox Code Playgroud)
文档指出该函数至少分配大小字节的内存(允许分配更多字节)。顺便说一下,该函数在内部使用posix_memalign,但是实现可能会发生变化。
我想知道是否可以为这种功能编写单元测试?我们如何测试是否分配了所需的内存量?
更新:
如果我们不能编写单元测试,那么最接近的解决方案是什么?
写作有区别吗:
throw SomeException;
Run Code Online (Sandbox Code Playgroud)
和
throw(SomeException);
Run Code Online (Sandbox Code Playgroud)
我看到一些消息来源声称后者(括号)不是出于某种原因的好选择但是我不记得我在哪里见过这个.
举个例子:
double values[] {2.5, -3.5, 4.5, -5.5, 6.5, -7.5};
std::vector<double> squares(std::end(values) - std::begin(values));
std::transform(std::begin(values), std::end(values), std::begin(values), std::begin(squares),
[](double x1, double x2) throw() { return x1 * x2; });
Run Code Online (Sandbox Code Playgroud)
这在功能上是否等同于以下内容?
[](double x1, double x2) noexcept { return x1 * x2; })
Run Code Online (Sandbox Code Playgroud)是否有令人信服的原因,为什么我要用修饰符标记这样的表达式(或类似的基本表达式),或者在这种情况下,最好不要使用它,而不必打扰?
__attribute__(nothrow)将函数声明为与throw()使用支持 gnu 扩展的 C++ 编译器(例如 Linux 上的 g++ 本身;C++03)之间有什么区别。
据我了解,这两种变体都是说编译器该函数不会抛出异常。但具体实现可能会有所不同
编译器将如何使用这些信息?
如果我在 nothrow 或函数内部运行时抛出异常throw()并且该异常将上升到该函数怎么办?函数会进一步传递异常还是会隐藏异常或其他什么?
我来自 c++98,我正在尝试进入 c++11 等等。我遇到了公共成员函数 , std::exception::what, <=>virtual const char* what() const noexcept;
从这个例子中给出的c++参考:what_example,我可以理解用法,但我有几个问题:
// exception::what
#include <iostream> // std::cout
#include <exception> // std::exception
struct ooops : std::exception {
const char* what() const noexcept {return "Ooops!\n";}
};
int main () {
try {
throw ooops();
} catch (std::exception& ex) {
std::cout << ex.what();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
virtual const char* what() const throw();,在 c++11 中,它变成virtual const char* what() const noexcept; …