草庐IT

nothrow_move_constructible

全部标签

c++ - 使用 std::move 返回时 "return-by-rvalue-ref"和 "return-by-value"之间的区别?

考虑以下代码:#includeusingnamespacestd;structI{I(I&&rv){coutC包含I。而C::foo()允许您将I移出C。上面使用的成员函数有什么区别:I&&foo(){returnmove(i)};//returnrvalueref和以下替换成员函数:Ifoo(){returnmove(i)};//returnbyvalue对我来说,它们似乎做同样的事情:Ii=c.foo();导致调用I::I(I&&);.本例未涉及的会有什么后果? 最佳答案 撇开您编写的程序是否真正有意义的考虑因素(从数据成员移动

c++ - 没看懂Stroustup先生建议删除抽象类Shape的copy default和move操作

我试图理解作者在他的新书(TCPL第4版)中3.3.4SuppressingOperations中的建议,但无济于事。书摘Usingthedefaultcopyormoveforaclassinahierarchyistypicallyadisaster:Givenonlyapointertoabase,wesimplydon’tknowwhatmembersthederivedclasshas(§3.3.3),sowecan’tknowhowtocopythem.So,thebestthingtodoisusuallytodeletethedefaultcopyandmoveoper

c++ - 返回成员变量时如何利用 move 语义?

我正在实现一个构建uint8_tvector的工厂类。我希望能够在返回结果vector时利用move语义。这似乎可行,但我不确定这是完成我想要的事情的正确方法。我已经看到很多关于如何将返回的自动变量视为右值并使用调用代码的move构造函数的示例,但在我的示例中,返回的对象是一个成员。我知道如果调用者将返回值放入move构造函数中,成员将丢失其内容-这正是我想要的。我是这样写的:#include#include#includeclassFactory{public:std::vector_data;Factory(std::size_tsize):_data(size,0){}voidb

c++ - std::is_constructible<void()>::value 的正确结果是什么?

std::is_constructible::value的结果不一致.我对该标准的解释是它应该是错误的。然而,Clang,同时具有libc++和libstdc++*,给出了true。GCC和MSVC都给出false。哪个结果是正确的?标准语这是标准的N4527[meta.unary.prop]/7:Giventhefollowingfunctiondeclaration:templateadd_rvalue_reference_tcreate()noexcept;thepredicateconditionforatemplatespecializationis_constructibl

c++ - `new (std::nothrow)`是如何实现的?

我有一个C++程序,其中重载了new运算符。问题是如果我在new运算符中的分配失败,我仍然会调用构造函数。我知道我可以通过抛出std::bad_alloc来避免这种情况,但我不想那样做。我怎样才能在重载的new运算符中失败并且仍然不调用我的构造函数?本质上,我想实现类似new(std::nothrow)的东西。这里有一个例子来说明我的意思。请注意我正在测试的系统on没有内存保护。所以访问NULL不会做任何事情示例1:重载新运算符#include#include#includeclassTest{public:Test(void){printf("Testconstructor\n");

c++ - 为什么不调用 move 构造函数?

这个问题在这里已经有了答案:Whatarecopyelisionandreturnvalueoptimization?(5个答案)Copyconstructornotcalled?(2个答案)关闭6年前。据我了解,move构造函数将在创建临时对象时调用。这里getA()函数返回一个临时对象,但我的程序没有打印来自move构造函数的消息:#includeusingnamespacestd;classA{public:A(){cout

c++ - 复制省略 : move constructor not called when using ternary expression in return statement?

考虑以下示例:#includeclassobject{public:object(){printf("constructor\n");}object(constobject&){printf("copyconstructor\n");}object(object&&){printf("moveconstructor\n");}};staticobjectcreate_object(){objecta;objectb;volatileinti=1;//With#if0,object'scopyconstructoriscalled;otherwise,itsmoveconstructor

c++ - 如何根据 is_nothrow_move_constructible<T> 声明包装类型 X<T> noexcept 的移动构造函数?

假设我有一个包装类型templatestructX{/*..*/};而且我不能只是X(X&&)=default因为我必须在那里做一些重要的事情。但是,我希望它是noexcept但前提是T(T&&)是noexcept。这可以使用::std::is_nothrow_move_constructible进行测试。我不知道如何根据constexpr有条件地启用构造函数的一个版本或另一个版本。我想可能有一种使用SFINAE的方法,但我不知道如何将其应用于ctors。 最佳答案 noexcept说明符接受任何bool常量表达式,因此您可以直接检

c++ - 无论如何有一个 valgrind 消息 "Conditional jump or move depends on uninitialized value"可以是所谓的 'false positive'

我在这里找到的大多数问题都提供一段代码,并由指出实际错误的人回答。我的问题是关于一般未初始化值的条件跳转。我可以理解,如果确定此分配仅完成一次并且在程序的生命周期内可能需要,则不必在程序结束时清理一block内存。据我所知,当程序终止时,GType系统会留下大量未释放的内存。这些未释放的block可以被视为“误报”。但是“有条件的跳跃或移动未初始化的值”会是误报吗?我唯一能想出的是有人通过读取随机地址来实现(坏的)随机函数(其中随机地址本身是棘手的部分;)。另一个例子可能是硬件映射到内存的一部分然后被读取,但这主要是由驱动程序而不是由普通用户应用程序完成的。是否有任何其他示例(最好是C

c++ - 为什么 std::move 需要前向引用?

std::move的实现基本上是这样的:templatetypenamestd::remove_reference::type&&move(T&&t){returnstatic_cast::type&&>(t);}请注意,std::move的参数是一个通用引用(也称为转发引用,但我们这里不转发)。也就是说,您可以std::move左值和右值:std::stringa,b,c;//...foo(std::move(a));//fine,aisanlvaluefoo(std::move(b+c));//nonsense,b+cisalreadyanrvalue但既然std::move的全部