代码之家  ›  专栏  ›  技术社区  ›  Alexandre C.

作为左值传递临时值

  •  0
  • Alexandre C.  · 技术社区  · 15 年前

    我想用下面这个成语,我认为是不规范的。我有返回向量的函数,利用返回值优化:

    vector<T> some_func()
    {
        ...
        return vector<T>( /* something */ );
    }
    

    vector<T>& some_reference;
    std::swap(some_reference, some_func());
    

    但是 some_func

    我的问题是 :是否有某种方法可以实现我想做的完全相同的事情(即构造一个向量,分配给另一个向量,并销毁旧的向量),这是兼容的(并且不使用赋值运算符,见下文)?

    class T
    {
        T(T const&);
        void swap(T&);
        T& operator=(T x) { this->swap(x); return *this; }
    };
    

    它利用了复制省略,解决了我的问题。但是对于标准类型,我真的很想使用 swap 因为我不想要一份无用的临时文件。

    由于我必须使用VC8并生成标准C++,所以我不想听到C++ 0x及其rValk引用。

    编辑:最后,我想到了

    typedef <typename T>
    void assign(T &x, T y)
    {
        std::swap(x, y);
    }
    

    当我使用左值时,因为如果y是临时的,编译器可以自由地优化对复制构造函数的调用,并使用 std::swap 当我有左值的时候。我使用的所有类都是实现 标准::交换 .

    3 回复  |  直到 15 年前
        1
  •  1
  •   fredoverflow    15 年前

    std::vector 是一个类类型,可以对r值调用成员函数:

    some_func().swap(some_reference);
    
        2
  •  1
  •   Pieter    15 年前

    如果你不想要临时文件的无用副本,不要按值返回。 使用(共享)指针,通过引用传递要填充的函数参数,插入迭代器。。。。

        3
  •  0
  •   Miquel Ramirez    15 年前

    我知道的唯一方法——在标准的约束下——实现你想要的是应用 元编程技术: http://en.wikipedia.org/wiki/Expression_templates 对你来说这可能不容易。