相关疑难解决方法(0)

我应该在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++ 03 throw()说明符C++ 11 noexcept之间的区别

有没有之间的任何其他差别throw()noexcept除了被检查的运行时分别编译时间?

维基百科C++ 11文章表明不推荐使用C++ 03 throw说明符.
为什么这样,noexcept有足够的能力在编译时覆盖所有这些?

[注意:我提到了这个问题这篇文章,但没有得到弃用的充分理由.]

c++ exception throw noexcept c++11

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

默认的Move构造函数是否定义为noexcept?

在重新分配时,在确定是否移动或复制元素之前,向量将检查移动构造函数是否标记为noexcept.默认移动构造函数是否定义为noexcept?我看到了以下文档,但没有说明这一点.http://en.cppreference.com/w/cpp/language/move_constructor

隐式声明的移动构造函数

如果没有为类类型(结构,类或联合)提供用户定义的移动构造函数,并且满足以下所有条件:没有用户声明的复制构造函数没有用户声明的复制赋值运算符没有用户声明的移动赋值运算符没有用户声明的析构函数,由于下一节中详述的条件,隐式声明的移动构造函数未定义为已删除,因此编译器将声明移动构造函数作为其类的内联公共成员signature T :: T(T &&)一个类可以有多个移动构造函数,例如T :: T(const T &&)和T :: T(T &&).如果存在一些用户定义的移动构造函数,则用户仍可以使用关键字default强制生成隐式声明的移动构造函数.

c++ constructor move-semantics c++11

64
推荐指数
1
解决办法
1万
查看次数

noexcept,堆栈展开和性能

以下来自Scott Meyers的新C++ 11书中的草稿(第2页,第7-21行)

展开调用堆栈和可能展开调用堆栈之间的区别对代码生成产生了惊人的巨大影响.在noexcept功能,优化不需要保持运行栈在unwindable状态,如有异常会向外传播的功能,也不是他们必须确保在noexcept函数对象在施工相反的顺序应该例外离开此功能被破坏.结果是更多的优化机会,不仅在noexcept函数的主体内,而且在调用函数的站点.这种灵活性仅适用于noexcept功能.具有"throw()"异常规范的函数缺少它,没有异常规范的函数也没有.

相比之下,部分5.4"关于C++的性能技术报告"描述了"代码"和实施异常处理的"表"的方式.特别是,当没有抛出异常并且只有空间开销时,"table"方法被显示没有时间开销.

我的问题是这个 - 斯科特迈尔斯在谈论解散和可能解散的时候谈到了什么优化?为什么这些优化不适用throw()?他的评论是否仅适用于2006 TR中提到的"代码"方法?

c++ exception-handling noexcept c++11

43
推荐指数
3
解决办法
4805
查看次数

我总是应该使用noexcept吗?

我应该总是在C++ 11中为getter使用noexcept方法修饰符吗?

我的意思是简单的吸气者,只是回归成员.至少在我所有的getter中,我有一个例外是不可能抛出的.一个缺点是getter变得过于冗长:

const std::string& getName() const noexcept{ return name; }
Run Code Online (Sandbox Code Playgroud)

Stroustrup的书中指出的好处是编译器可能会在这里和那里做一些优化.

c++ c++11

33
推荐指数
1
解决办法
2631
查看次数

为什么重新分配矢量副本而不是移动元素?

可能重复:
如何在向量增长时强制执行移动语义?

insert,push_backemplace(_back)可能导致的重新分配std::vector.我很困惑地看到以下代码复制元素而不是在重新分配容器时移动它们.

#include <iostream>
#include <vector>

struct foo {
    int value;

    explicit foo(int value) : value(value) {
        std::cout << "foo(" << value << ")\n";
    }

    foo(foo const& other) noexcept : value(other.value) {
        std::cout << "foo(foo(" << value << "))\n";
    }

    foo(foo&& other) noexcept : value(std::move(other.value)) {
        other.value = -1;
        std::cout << "foo(move(foo(" << value << "))\n";
    }

    ~foo() {
        if (value != -1)
            std::cout << "~foo(" …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector move-semantics c++11

28
推荐指数
3
解决办法
6493
查看次数

如果禁用例外,所有功能都是"noexcept"吗?

如果你通过编译来关闭异常-fno-exceptions所有被认为是noexcept的函数,例如by std::move_if_noexcept或者你是否仍然必须声明函数noexcept?

c++ gcc language-lawyer c++11

25
推荐指数
1
解决办法
1543
查看次数

如何在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
查看次数

好的或坏的做法,使纯虚函数noexcept

制作纯虚函数是不是好的还是坏的做法?我一直认为我们不应该对它的实现类施加额外的限制,因为它实现应该没有抛出,因为这可能导致实现中的修改和不必要的try catch块以防止异常转移.我认为实现应该决定函数是否可以标记为no而不是异常规范应该决定实现?

如果我错了,有人可以纠正我吗?

c++ c++11

11
推荐指数
2
解决办法
1523
查看次数

在调用C函数的其他非抛出内联函数中添加noexcept?

我已经为某些C库实现了C++绑定.库API调用可能会失败,但显然不能抛出任何东西; 为了这个问题的目的,我的绑定都是内联的.

现在,对于我的大多数内联函数/方法,编译器可以弄清楚不能抛出异常; 例如,假设我有:

bool foo() { 
    auto result = wrapped_lib_foo(); 
    return some_constexpr_nothrow_cond(result); 
}
Run Code Online (Sandbox Code Playgroud)

我应该用这样的功能/方法标记noexcept吗?

笔记:

c++ noexcept c++11

10
推荐指数
1
解决办法
394
查看次数