相关疑难解决方法(0)

我什么时候应该使用noexcept?

noexcept关键字可以适当地应用于许多功能签名,但我不能确定何时我应该考虑在实践中使用它.根据我到目前为止所读到的内容,最后一分钟的添加noexcept似乎解决了移动构造函数抛出时出现的一些重要问题.但是,我仍然无法对一些实际问题提供令人满意的答案,这些问题使我首先要了解更多信息noexcept.

  1. 我知道永远不会抛出许多函数的例子,但编译器无法自行确定.noexcept所有这些情况下我应该附加到函数声明吗?

    不得不考虑我是否需要noexcept每个函数声明之后追加,这将大大降低程序员的工作效率(坦率地说,这将是一个痛苦的屁股).对于哪些情况,我应该更加小心使用noexcept,以及在哪些情况下我可以使用暗示noexcept(false)

  2. 我何时才能真实地期望在使用后观察到性能提升noexcept?特别是,给出一个代码示例,C++编译器在添加之后能够生成更好的机器代码noexcept.

    就个人而言,我关心的是noexcept因为编译器提供了更大的自由来安全地应用某些类型的优化.现代编译器是否noexcept以这种方式利用?如果没有,我可以期待他们中的一些人在不久的将来这样做吗?

c++ exception-handling exception noexcept c++11

472
推荐指数
8
解决办法
9万
查看次数

我应该在C++中使用异常说明符吗?

在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)

由于以下因素,我对实际使用它们表示怀疑:

  1. 编译器并没有以任何严格的方式真正强制执行异常说明符,因此效益并不高.理想情况下,您希望得到编译错误.
  2. 如果函数违反了异常说明符,我认为标准行为是终止程序.
  3. 在VS.Net中,它将throw(X)视为throw(...),因此遵守标准并不强.

你认为应该使用异常说明符吗?
请回答"是"或"否"并提供一些理由来证明您的答案.

c++ exception function throw specifier

119
推荐指数
5
解决办法
3万
查看次数

在C++中创建自定义异常

我正在学习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)

c++ exception

24
推荐指数
2
解决办法
3万
查看次数

如何在C++中使用noexcept或它是如何工作的?

我无法理解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这里的使用是没用的,或者是吗?

我的疑问是:

  1. noexcept工作怎么样?

  2. 怎么用?

  3. 什么throw()不能做到这noexcept一点?

noexcept c++11

15
推荐指数
3
解决办法
7908
查看次数

我们可以对内存分配进行单元测试吗?

我必须测试一个提供自己的内存分配例程的库:

void* allocation_routine(size_t size) throw();
Run Code Online (Sandbox Code Playgroud)

文档指出该函数至少分配大小字节的内存(允许分配更多字节)。顺便说一下,该函数在内部使用posix_memalign,但是实现可能会发生变化。

我想知道是否可以为这种功能编写单元测试?我们如何测试是否分配了所需的内存量?

更新:

如果我们不能编写单元测试,那么最接近的解决方案是什么?

c c++ linux unit-testing memory-management

14
推荐指数
1
解决办法
957
查看次数

在throw参数周围添加括号是否有效?

写作有区别吗:

throw SomeException;
Run Code Online (Sandbox Code Playgroud)

throw(SomeException);
Run Code Online (Sandbox Code Playgroud)

我看到一些消息来源声称后者(括号)不是出于某种原因的好选择但是我不记得我在哪里见过这个.

c++ throw parentheses

5
推荐指数
1
解决办法
576
查看次数

对于lambda表达式,noexcept和空抛出规范之间有什么区别吗?

举个例子:

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)
  1. 这在功能上是否等同于以下内容?

    [](double x1, double x2) noexcept { return x1 * x2; })
    
    Run Code Online (Sandbox Code Playgroud)
  2. 是否有令人信服的原因,为什么我要用修饰符标记这样的表达式(或类似的基本表达式),或者在这种情况下,最好不要使用它,而不必打扰?

c++ lambda noexcept

5
推荐指数
1
解决办法
730
查看次数

将函数声明为 __attribute__(nothrow) 和 `throw()` 有什么区别

__attribute__(nothrow)将函数声明为与throw()使用支持 gnu 扩展的 C++ 编译器(例如 Linux 上的 g++ 本身;C++03)之间有什么区别。

据我了解,这两种变体都是说编译器该函数不会抛出异常。但具体实现可能会有所不同

编译器将如何使用这些信息?

如果我在 nothrow 或函数内部运行时抛出异常throw()并且该异常将上升到该函数怎么办?函数会进一步传递异常还是会隐藏异常或其他什么?

c++ exception

4
推荐指数
1
解决办法
1493
查看次数

什么是 std::exception::what() 以及为什么使用它?

我来自 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)
  1. 在 c++98 中,what() 是 : virtual const char* what() const throw();,在 c++11 中,它变成virtual const char* what() const noexcept; …

c++ exception noexcept c++11

-1
推荐指数
1
解决办法
2719
查看次数