使用构造函数进行引用初始化
Reference initialization with constructor
const T a {}; // constant of type T
const T& b {}; // ???
T c {}; // variable of type T
T& d {}; // error
a
和b
有什么区别?
b
是一个引用,但我没有为其分配对象:在该指令中,我通过 T 构造函数对其进行了初始化。
b
的地址介于a和c的地址之间,所以b
和a
似乎没有区别。
如果我可以声明和初始化 b
为什么 d
会出现编译错误?
我谈到了泛型类型 T。我针对基本类型和 类 测试了上面的代码,结果是相同的。
在这些声明中
const T a {}; // constant of type T
const T& b {};
创建了默认初始化的常量对象 a
和默认初始化的临时对象的常量引用 b
。
编译器针对此引用声明发出错误
T& d {}; // error
因为声明了对临时对象的非常量引用。
您可以通过以下方式声明右值引用
T&& d {};
这是一个演示程序
#include <iostream>
int main()
{
const int &ri {};
std::cout << "ri = " << ri << '\n';
int && rri {};
std::cout << "rri = " << rri << '\n';
return 0;
}
程序输出为
ri = 0
rri = 0
const T a {}; // constant of type T
const T& b {}; // ???
T c {}; // variable of type T
T& d {}; // error
a
和b
有什么区别?
b
是一个引用,但我没有为其分配对象:在该指令中,我通过 T 构造函数对其进行了初始化。
b
的地址介于a和c的地址之间,所以b
和a
似乎没有区别。
如果我可以声明和初始化 b
为什么 d
会出现编译错误?
我谈到了泛型类型 T。我针对基本类型和 类 测试了上面的代码,结果是相同的。
在这些声明中
const T a {}; // constant of type T
const T& b {};
创建了默认初始化的常量对象 a
和默认初始化的临时对象的常量引用 b
。
编译器针对此引用声明发出错误
T& d {}; // error
因为声明了对临时对象的非常量引用。
您可以通过以下方式声明右值引用
T&& d {};
这是一个演示程序
#include <iostream>
int main()
{
const int &ri {};
std::cout << "ri = " << ri << '\n';
int && rri {};
std::cout << "rri = " << rri << '\n';
return 0;
}
程序输出为
ri = 0
rri = 0