C++ 为什么不是';是否在此处对引用初始化执行复制初始化?

C++ 为什么不是';是否在此处对引用初始化执行复制初始化?,c++,c++11,c++14,C++,C++11,C++14,给定 #包括 使用名称空间std; 结构测试{ 公众: 测试(){ coutTest&&t1=Test();不会创建对副本的引用,而是Test()生成临时对象,并且t1直接绑定到该临时对象(临时对象的生存期延长到t1的生存期) 2) 当使用初始值设定项声明名为的右值引用变量时 否则,如果引用是对常量的右值引用或左值引用,则: 如果对象是一个xvalue、一个类prvalue、一个数组prvalue或一个函数左值类型,它要么是T,要么是从T派生的,相等或更少cv限定,那么引用绑定到初始化表达式的

给定

#包括
使用名称空间std;
结构测试{
公众:
测试(){
cout
Test&&t1=Test();
不会创建对副本的引用,而是
Test()
生成临时对象,并且
t1
直接绑定到该临时对象(临时对象的生存期延长到
t1
的生存期)


2) 当使用初始值设定项声明名为的右值引用变量时

否则,如果引用是对常量的右值引用或左值引用,则:

如果对象是一个xvalue、一个类prvalue、一个数组prvalue或一个函数左值类型,它要么是T,要么是从T派生的,相等或更少cv限定,那么引用绑定到初始化表达式的值或它的基子对象

Test&&t1=Test();
不创建对副本的引用,而是
Test()
生成一个临时对象,并且
t1
直接绑定到该临时对象(临时对象的生存期延长到
t1
的生存期)


2) 当使用初始值设定项声明名为
的右值引用变量时

否则,如果引用是对常量的右值引用或左值引用,则:

如果对象是一个xvalue、一个类prvalue、一个数组prvalue或一个函数左值类型,它要么是T,要么是从T派生的,相等或更少cv限定,那么引用绑定到初始化表达式的值或它的基子对象


对象是xvalue还是类prvalue?我认为构造函数表达式没有与它们关联的值,因为它们不返回任何内容。我相信prvalue。所有表达式都是左值、xvalue或prvalue中的一个。构造函数不
返回任何内容,但构造函数表达式仍然具有构造的对象构造函数表达式不只是对构造函数的函数调用,就像使用
new
不只是对分配函数的函数调用一样。编译器会做额外的工作。但是由于prvalue具有右值的属性,我不知道在
Test t
de这样的示例中它如何绑定到左值claration
Test t;
不会创建右值或将任何右值绑定到任何对象。也许你是指其他对象?这应该没问题,因为默认构造函数有0个参数。对象是xvalue还是类prvalue?我认为构造函数表达式没有与它们关联的值,因为它们不返回任何内容。prvalue I believe.所有表达式都是lvalue、xvalue或prvalue中的一个。构造函数不会
返回任何内容,但构造函数表达式仍将构造的对象作为其值。构造函数表达式不仅仅是对构造函数的函数调用,就像使用
new
不仅仅是对alloc的函数调用一样编译函数。编译器做额外的工作。但是由于prvalue具有右值的属性,我不知道如何将它绑定到左值,例如
Test t
a声明
Test t;
不会创建右值或将任何右值绑定到任何东西。也许你是指其他东西?这应该可以,因为默认设置是正确的构造函数有0个参数
#include <iostream>

using namespace std;

struct Test {


public:
    Test() {

        cout << "Default constructor" << endl;
    }

    Test(const Test &) {

        cout << "Copy constructor" << endl;
    }
};

int main() {

    Test && t1 = Test();
}