标签: noexcept

为什么clear()函数是noexcept而析构函数不是?

我注意到,在分配器感知的容器接口中,标准要求clear()成员函数是noexcept,而析构函数不是。std::forward_list此外,在某些基于节点的容器(例如和 )的情况下会出现差异,std::set因为clear()成员函数执行与析构函数相同的操作。这种差异有什么原因吗?

c++ std noexcept c++11

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

这三个默认构造函数在 C++ 中等效吗?

考虑以下代码:

#include <type_traits>

template<typename T>
struct A1 {
    T t;

    // implicitly-declared default constructor
};

template<typename T>
struct A2 {
    T t;

    // explicitly-declared default constructor without noexcept
    A2() = default;
};

template<typename T>
struct A3 {
    T t;

    // explicitly-declared default constructor with noexcept
    A3() noexcept(std::is_nothrow_default_constructible<T>::value) = default;
};
Run Code Online (Sandbox Code Playgroud)

这三个默认构造函数在 C++ 中等效吗?

c++ standards class default-constructor noexcept

1
推荐指数
2
解决办法
148
查看次数

为什么std :: is_nothrow_move_assignable取决于析构函数的存在?

我有一个类如下:

class C {
public:
    C() : ... {}
    ~C() {}

    Member_1 m_1;
    // ...
    Member_N m_N;
};
Run Code Online (Sandbox Code Playgroud)

显示的两个特殊成员函数是唯一声明的成员函数.

现在,

static_assert(std::is_nothrow_move_assignable<Member_1>::value);
// ...
static_assert(std::is_nothrow_move_assignable<Member_N>::value);
Run Code Online (Sandbox Code Playgroud)

都很满意.然而,

static_assert(std::is_nothrow_move_assignable<C>::value);
Run Code Online (Sandbox Code Playgroud)

断言.如果我删除空的析构函数,它会通过.

析构函数与移动赋值运算符有什么关系?新规则五?

编译器是GCC 4.9.3 -std=c++0x(由于历史原因).

c++ destructor move-semantics noexcept c++11

0
推荐指数
1
解决办法
139
查看次数

没有 - 除非没有通过论证

你能说我怎么断言,是函数noexcept(没有传递参数)?谢谢.

c++ noexcept c++11

0
推荐指数
1
解决办法
74
查看次数

什么是 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
查看次数