可变模板与完美的转发没有优化移动语义
variadic template with perfect forwarding not optimised for move semantics
大家好,我遇到了一个问题,即在我创建的可变添加模板上不调用移动函数
#include <iostream>
#include <algorithm>
#include <functional>
class wrapped_heap_integer{
public:
wrapped_heap_integer() : value(nullptr)
{
std::cout << "Default ctorn";
}
explicit wrapped_heap_integer(int value_) : value(new int(value_))
{
std::cout << "ctorn";
}
~wrapped_heap_integer(){
if(value != nullptr) delete value;
std::cout << "dtorn";
}
wrapped_heap_integer(wrapped_heap_integer const & other) : value(new int(*(other.value))){
std::cout << "copy ctorn";
}
wrapped_heap_integer(wrapped_heap_integer&& other) : value(other.value){
other.value = nullptr;
std::cout << "move ctorn";
}
wrapped_heap_integer& operator = (wrapped_heap_integer other){
std::swap(value,other.value);
std::cout << "copy assignmentn";
return *this;
}
wrapped_heap_integer& operator = (wrapped_heap_integer&& other){
delete value;
value = other.value;
other.value = nullptr;
std::cout << "move assignmentn";
return *this;
}
wrapped_heap_integer operator + (wrapped_heap_integer const & other){
wrapped_heap_integer a(*value + *(other.value));
return a;
}
wrapped_heap_integer& operator+=(wrapped_heap_integer const & other){
*value += *(other.value);
return *this;
}
friend std::ostream& operator << (std::ostream& o, wrapped_heap_integer& w);
private:
int* value;
};
std::ostream& operator << (std::ostream& o, wrapped_heap_integer& w){
o << *(w.value);
return o;
}
template<typename Head>
Head&& add(Head&& head){
return std::forward<Head>(head);
}
template<typename Head, typename... Tail>
auto add(Head&& head, Tail&&... tail) -> decltype(head + add(std::forward<Tail>(tail)...))
{
return head + add(std::forward<Tail>(tail)...);
}
int main(int argc, const char * argv[])
{
auto result = add(wrapped_heap_integer(4),wrapped_heap_integer(10),wrapped_heap_integer(1));
std::cout << result << std::endl;
return 0;
}
我想你这里有普遍的参考。转发实参以不复制右值
template<typename Head>
Head add(Head&& head){
return std::forward<Head>(head);
}
相关文章:
- 空基优化子对象的地址
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 关闭||运算符优化
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 返回值优化:显式移动还是隐式
- 编译器是否优化了默认移动构造函数?
- 标志以将IPDB和IOBJ文件从链接时间代码生成优化(LTCG)移动
- 按值返回堆栈上的变量是否优化为移动
- 从具有移动语义或返回值优化的函数返回值,但不返回复制构造函数
- RVO和NRVO优化+C++11移动操作员
- 移动省略优化
- 异常、移动语义和优化:任由编译器摆布 (MSVC2010)?
- c++11返回值优化或移动
- 将对以字符串形式返回文件内容的函数执行移动语义优化或返回值优化,我会从中受益吗
- 移动或命名返回值优化(NRVO)
- C++11移动构造函数优化
- 小字符串优化(SSO)和移动语义
- 可变模板与完美的转发没有优化移动语义