可变模板与完美的转发没有优化移动语义

variadic template with perfect forwarding not optimised for move semantics

本文关键字:优化 移动 语义 转发 完美      更新时间:2023-10-16

大家好,我遇到了一个问题,即在我创建的可变添加模板上不调用移动函数

#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);
}