根据C++标准,以下程序的预期(如果有)输出是什么:#include#include#includeclassA{public:A()=default;~A()=default;A(Aconst&other){}A(A&&other)noexcept{}A&operator=(Aother)noexcept{return*this;}};intmain(){std::cout::value::value换句话说,类型特征值的评估是否只看赋值运算符的声明,即noexcept,并因此产生truetrue或者它是否考虑调用上下文(a、b是A的实例)a=b;//maythrow,implici
有如下代码:classMember{public:~Member()noexcept(false){}};classA{public:virtual~A(){}};classB:publicA{public:Memberm;};错误是:main.cpp:13:7:error:looserthrowspecifierfor‘virtualB::~B()noexcept(false)’classB:publicA^main.cpp:10:11:error:overriding‘virtualA::~A()noexcept’virtual~A(){}^为什么B类中的析构函数被标记为noexc
我的复制构造函数旁边有一个noexcept说明符。#include#includeclassFoofinal{public:Foo()noexcept=default;Foo(constFoo&oth):impl_(std::make_unique()){}//impl_;};classFoo::Impl{...private:std::vectorsome_data;}当std::make_unique可以抛出bad_alloc时,我不确定是否应该将noexcept放在复制构造函数旁边。我们将不胜感激! 最佳答案 cpp编码指南在
我研究了一下,operator函数的格式是(returnvalue)operator[space]op(arguments){implementation}但是,在std::reference_wrapper实现中,有一个运算符重载函数声明为operatorT&()constnoexcept{return*_ptr;。这个运算符和T&operator()constnoexcept{return*_ptr;不同吗?}?.如果两者不同,那么第一个有什么用? 最佳答案 运算符T&()constnoexcept;是一个user-define
假设我有一个这样的构造函数Something(SomethingElse)noexcept:member{SomethingElse,something_that_might_throw()}{...}如果member的构造可以抛出,在这种情况下noexcept是否可以?在上面的例子中,成员变量member是我不知道的类型。旁注:在使用noexcept时是否还有其他需要担心的边缘情况? 最佳答案 #UPDATE:(基于您的编辑):原始答案适用于函数block作用域内的所有内容(包含构造函数,包括构造函数-初始化列表)。你为什么不tr
我有一些代码采用打包的POD结构/类并将其复制到内存块中。structA{inta;intb;}a;memcpy(mymemoryblock,(void*)&a,sizeof(A));//laterIgetareplyand...memcpy((void*)&a,mymemoryblock,sizeof(A));这仅对POD类型的数据有效,我想知道是否有一种方法可以测试POD-ness。如果有人不小心给这个类添加了一个成员函数,memcpy操作就会失效,但仍然可以编译。这导致很难检测到错误。是否有is_POD_type(A)函数或其他技巧可用于在运行时或编译时检测PODness?
考虑以下示例代码:#includevoidblah();intbuh;constexprautoget(){returnstd::get(std::make_tuple(&blah,&buh));}intmain(){get();}人们会期望因为函数get()是一个常量表达式,所以它会返回一个常量。事实并非如此:std::make_tuple、std::get被实例化并调用:https://godbolt.org/g/PkHrTp现在,如果我们将get()的实现替换为constexprautoget(){constexprautox=std::get(std::make_tuple(&
在下面的代码中,我认为断言不应该触发,但它确实触发了。structA{~A()noexcept(false);};Af()noexcept;intmain(){static_assert(noexcept(f()),"fmustbenoexcept");}函数f()显然是noexcept,但是noexcept(f())被评估为false。(在gcc和clang中)我是不是遗漏了什么或者是错误? 最佳答案 表达式e上的noexcept运算符告诉您表达式的潜在异常集是否为空。根据[except.spec]/(13.2),此集合包含析构函
当阅读C++11时,我有一种感觉,当使用标准容器(如std::vector)和用户定义的数据类型时,鼓励提供noexceptmove操作,如果有的话,因为那时且只有那时容器会在内部真正move数据而不是复制。今天尝试时,我发现-std=c++1y(对于C++14)和g++-4.8没有区别。也许我错过了规范中的更新,也许我的示例是错误的。我比较了三种应该可以move的数据结构的区别默认情况下可按照“零规则”move可通过提供move操作来movewithoutnoexcept可通过noexcept提供move操作来move框架:#include#include#include#inclu
std::function在func.wrap.func中的概要告诉我们function&operator=(function&&);移动赋值运算符不是noexcept,禁止将其用于标准容器中的仅移动类型。但是!它还告诉我们voidswap(function&)noexcept;同样,默认的构造函数是function()noexcept;因此我们可以使用默认构造函数后跟交换来实现移动构造函数。因为我们可以用swap实现移动赋值运算符(swap有更强的后置条件):如何在std::function中实现noexcept交换?为什么std::function的移动赋值运算符不是noexcep