对于new运算符,我们有std::nothrow版本:std::unique_ptrp=new(std::nothrow)T();std::make_shared或std::make_unique有这样的东西吗? 最佳答案 不,我们没有。查看make_unique的cppreference页面和make_shared,我们看到每个版本都使用默认的new重载。实现一个并不难,但是,像这样:templatestd::unique_ptrmake_unique_nothrow(Args&&...args)noexcept(noexcept
C++的new有一个选项可以在分配失败时返回空指针而不是抛出bad_alloc异常。Foo*pf=new(std::nothrow)Foo(1,2,3);(是的,我知道这只会阻止new抛出bad_alloc;它不会阻止Foo的构造函数抛出异常。)如果您想使用共享指针而不是原始指针,您通常应该使用make_shared,因为它可以巧妙地分配控制block。autopf=std::make_shared(1,2,3);make_shared封装了新版本,这使得(?)无法选择nothrow版本。因此,您似乎必须放弃make_shared并明确调用new。std::shared_ptrpf(n
C++的new有一个选项可以在分配失败时返回空指针而不是抛出bad_alloc异常。Foo*pf=new(std::nothrow)Foo(1,2,3);(是的,我知道这只会阻止new抛出bad_alloc;它不会阻止Foo的构造函数抛出异常。)如果您想使用共享指针而不是原始指针,您通常应该使用make_shared,因为它可以巧妙地分配控制block。autopf=std::make_shared(1,2,3);make_shared封装了新版本,这使得(?)无法选择nothrow版本。因此,您似乎必须放弃make_shared并明确调用new。std::shared_ptrpf(n
我惊讶地发现is_swappable和is_nothrow_swappable不在新的C++11type_traits元函数中。它们对于传播noexcept非常有用用于模板并确定是否可以为模板实现非抛出交换。libc++推出自己的内部版本:参见itsversionoftype_traits中的__is_swappable和__is_nothrow_swappable,并且它在内部广泛使用它们,但不使它们在库之外可用。我最终拼凑起来myownversionofthese对于个人项目,这似乎可行,但我确信它以某种方式损坏了。我很好奇这两个的缺席,因为它们似乎很重要。这个特性是在C++11标
我惊讶地发现is_swappable和is_nothrow_swappable不在新的C++11type_traits元函数中。它们对于传播noexcept非常有用用于模板并确定是否可以为模板实现非抛出交换。libc++推出自己的内部版本:参见itsversionoftype_traits中的__is_swappable和__is_nothrow_swappable,并且它在内部广泛使用它们,但不使它们在库之外可用。我最终拼凑起来myownversionofthese对于个人项目,这似乎可行,但我确信它以某种方式损坏了。我很好奇这两个的缺席,因为它们似乎很重要。这个特性是在C++11标
这个问题在这里已经有了答案:nothroworexception?(6个回答)关闭9年前。根据C++reference,您可以通过以下方式新建对象:MyClass*p1=newMyClass;或通过MyClass*p2=new(std::nothrow)MyClass;第二个将返回一个空指针而不是抛出异常。但是,根据我的经验,我几乎看不到这个版本。例如,Google不建议在他们的代码中使用异常,但我可以看到他们在Chromium中也没有使用nothrow版本。有什么理由让我们更喜欢默认的而不是nothrow吗?即使在不使用异常的项目中?--编辑--后续问题:我应该检查malloc()的
这个问题在这里已经有了答案:nothroworexception?(6个回答)关闭9年前。根据C++reference,您可以通过以下方式新建对象:MyClass*p1=newMyClass;或通过MyClass*p2=new(std::nothrow)MyClass;第二个将返回一个空指针而不是抛出异常。但是,根据我的经验,我几乎看不到这个版本。例如,Google不建议在他们的代码中使用异常,但我可以看到他们在Chromium中也没有使用nothrow版本。有什么理由让我们更喜欢默认的而不是nothrow吗?即使在不使用异常的项目中?--编辑--后续问题:我应该检查malloc()的
以下代码触发了static_assert,尽管我认为它不应该触发:#includetemplatestructTmp{~Tmp()noexcept(std::is_nothrow_destructible::value){}};structFoo;structBar{//CommentthisoutfortheproblemtogoawayTmpxx;//..orthisBar(){}};structFoo{};//Thistriggersstatic_assert(std::is_nothrow_destructible::value,"That'sodd");intmain(){}
以下代码无法使用VisualStudio2017(15.5)、gcc6.4.0和clang4.0.1进行编译,即静态断言失败:structType{Type(Type&&)noexcept{}~Type()noexcept(false){}};static_assert(std::is_nothrow_move_constructible::value,"Typeshouldbenothrow-move-constructible");static_assert(std::is_nothrow_constructible::value,"Typeshouldbenothrow-cons
我编写了以下代码来理解move语义。它在g++-4.6中按预期工作(即没有复制,只move),但在g++-4.7.0中没有。我认为这是g++-4.7.0中链接的错误,但这个link说这不是g++-4.7中的错误。因此,正如我从上面的链接中理解的那样,我使move构造函数不抛出,但它仍然只执行复制。但是,如果我不抛出复制构造函数,则只会发生move。谁能解释一下?#include#includeusingnamespacestd;structS{intv;staticintccount,mcount;S(){}//nothrowconstructor//S(nothrow)(constS