草庐IT

c++ - 我应该删除 move 构造函数和智能指针的 move 分配吗?

我正在实现一个简单的智能指针,它基本上跟踪对它处理的指针的引用数。我知道我可以实现move语义,但我认为这没有意义,因为复制智能指针非常便宜。特别是考虑到它带来了产生讨厌的错误的机会。这是我的C++11代码(我省略了一些无关紧要的代码)。也欢迎提出一般性意见。#ifndefSMART_PTR_H_#defineSMART_PTR_H_#includetemplateclassSmartPtr{private:structPtr{T*p_;uint64_tcount_;Ptr(T*p):p_{p},count_{1}{}~Ptr(){deletep_;}};public:SmartPtr

c++ - 我应该删除 move 构造函数和智能指针的 move 分配吗?

我正在实现一个简单的智能指针,它基本上跟踪对它处理的指针的引用数。我知道我可以实现move语义,但我认为这没有意义,因为复制智能指针非常便宜。特别是考虑到它带来了产生讨厌的错误的机会。这是我的C++11代码(我省略了一些无关紧要的代码)。也欢迎提出一般性意见。#ifndefSMART_PTR_H_#defineSMART_PTR_H_#includetemplateclassSmartPtr{private:structPtr{T*p_;uint64_tcount_;Ptr(T*p):p_{p},count_{1}{}~Ptr(){deletep_;}};public:SmartPtr

c++ - move 字符串流的 .str() 成员是否合法?

考虑以下示例:#includetemplateinlinestd::stringto_string(Tconst&op){std::ostringstreamresult;result如果我要返回result,而不是result.str(),它将自动成为一个右值。结果中包含的字符串并非如此(我假设)。我的期望是它被复制并且拷贝作为右值返回。所以我的问题是,这样做是否合法:returnstd::move(result.str());我会假设它是,期望流留下一个有效的空字符串。但我并不确定是否真的去做。 最佳答案 std::ostrea

c++ - move 字符串流的 .str() 成员是否合法?

考虑以下示例:#includetemplateinlinestd::stringto_string(Tconst&op){std::ostringstreamresult;result如果我要返回result,而不是result.str(),它将自动成为一个右值。结果中包含的字符串并非如此(我假设)。我的期望是它被复制并且拷贝作为右值返回。所以我的问题是,这样做是否合法:returnstd::move(result.str());我会假设它是,期望流留下一个有效的空字符串。但我并不确定是否真的去做。 最佳答案 std::ostrea

c++ - 为什么 C++11 对值参数有隐式 move ,但对右值参数没有?

在C++11中,值参数(和其他值)在返回时享受隐式move:Afunc(Aa){returna;//usesA::A(A&&)ifitexists}至少在MSVC2010中,右值引用参数需要std::move:Afunc(A&&a){returna;//usesA::A(Aconst&)evenifA::A(A&&)exists}我想在函数内部,右值引用和值的行为相似,唯一的区别是在值的情况下,函数本身负责销毁,而对于右值引用,责任在外部。在标准中区别对待它们的动机是什么? 最佳答案 标准化委员会付出了巨大的努力来创建措辞,以便只在

c++ - 为什么 C++11 对值参数有隐式 move ,但对右值参数没有?

在C++11中,值参数(和其他值)在返回时享受隐式move:Afunc(Aa){returna;//usesA::A(A&&)ifitexists}至少在MSVC2010中,右值引用参数需要std::move:Afunc(A&&a){returna;//usesA::A(Aconst&)evenifA::A(A&&)exists}我想在函数内部,右值引用和值的行为相似,唯一的区别是在值的情况下,函数本身负责销毁,而对于右值引用,责任在外部。在标准中区别对待它们的动机是什么? 最佳答案 标准化委员会付出了巨大的努力来创建措辞,以便只在

c++ - 是否可以 std::move 本地堆栈变量?

请考虑以下代码:structMyStruct{intiInteger;stringstrString;};voidMyFunc(vector&vecStructs){MyStructNewStruct={8,"Hello"};vecStructs.push_back(std::move(NewStruct));}intmain(){vectorvecStructs;MyFunc(vecStructs);}为什么会这样?在调用MyFunc的那一刻,返回地址应该放在当前线程的栈上。现在创建NewStruct对象被创建,它也应该放在堆栈上。通过std::move,我告诉编译器,我不打算再使用

c++ - 是否可以 std::move 本地堆栈变量?

请考虑以下代码:structMyStruct{intiInteger;stringstrString;};voidMyFunc(vector&vecStructs){MyStructNewStruct={8,"Hello"};vecStructs.push_back(std::move(NewStruct));}intmain(){vectorvecStructs;MyFunc(vecStructs);}为什么会这样?在调用MyFunc的那一刻,返回地址应该放在当前线程的栈上。现在创建NewStruct对象被创建,它也应该放在堆栈上。通过std::move,我告诉编译器,我不打算再使用

c++ - std::array 应该有 move 构造函数吗?

在std::array上不能有效地实现move(O(1)),那么为什么它有move构造函数呢? 最佳答案 std::array有一个编译器生成的move构造函数,它允许将一个实例的所有元素move到另一个实例中。如果元素可有效move或仅可move,这将很方便:#include#includestructFoo{Foo()=default;Foo(Foo&&){std::couta;std::arrayb=std::move(a);}所以我想说std::array应该有一个move复制构造函数,特别是因为它是免费的。没有一个需要它被

c++ - std::array 应该有 move 构造函数吗?

在std::array上不能有效地实现move(O(1)),那么为什么它有move构造函数呢? 最佳答案 std::array有一个编译器生成的move构造函数,它允许将一个实例的所有元素move到另一个实例中。如果元素可有效move或仅可move,这将很方便:#include#includestructFoo{Foo()=default;Foo(Foo&&){std::couta;std::arrayb=std::move(a);}所以我想说std::array应该有一个move复制构造函数,特别是因为它是免费的。没有一个需要它被