【问题标题】:How to properly bind rvalues to the constructor?如何正确地将右值绑定到构造函数?
【发布时间】:2015-06-26 04:53:02
【问题描述】:

这是我的代码:

#include <iostream>


class dummy{
    public:
    //constructor + destructor
    dummy(){
    std::cout<<"dummy constructed"<<std::endl;
    }


    //copy 
    dummy(const dummy& o){
    std::cout<<"dummy copy init"<<std::endl;
    }


    void operator=(const&dummy){
    std::cout<<"dummy copy operator"<<std::endl;
    }

    //moves
    dummy(dummy&& other){
    std::cout<<"dummy move init"<<std::endl;        
    }

    void operator=(dummy&&){
    std::cout<<"dummy move copy"<<std::endl;
    }

};



class test{
    public:
    dummy d;

    test(dummy&& d):d(std::move(d)){
    std::cout<<"test"<<std::endl;   
    }
};




int main(int argc, char** argv) {

    test m(dummy());        //prints NOTHING.
    test t(std::move(dummy()));

    return 0;
}

使用test m(dummy());

输出:没有

使用test t(std::move(dummy()));

输出:

dummy constructed
dummy move init
test

这是意料之中的事情。

所以我的问题是,

如果参数为type&amp;&amp;,是否必须使用std::move? 并且 dummy() 不被视为右值,那么为什么我需要使用 std::move ?我对将右值绑定到右值引用感到困惑,我需要澄清一下。

【问题讨论】:

标签: c++ most-vexing-parse


【解决方案1】:

test m(dummy()); 声明了一个名为m 的函数。您可能的意思是:

test m{ dummy{} };

它声明了一个变量m,传递了一个临时的dummy

【讨论】:

  • 呃,奇怪,为什么要括号?他们不是为了initializer list 吗?
  • @CarloBrew ( 对于它是函数参数列表还是参数列表不明确。但是{ 只能是一个参数列表。大括号可用于为对象提供初始化程序的任何情况。
猜你喜欢
  • 2015-04-02
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多