我正在通过故意试图破解事物来测试我对左值和左值参考的理解.所以说有这个结构:
struct FooBar
{
FooBar(int&& number) : rNumber(number)
{
}
int& rNumber;
};
我创建了一个实例FooBar obj(5).每次尝试读取引用变量都会返回正确的结果(5).如果我使用const int&而不是int&& ;.
我注意到用std :: string替换int并读取引用返回一个空字符串,所以我怀疑它给出了未定义的行为.是这样吗?如果是这样,为什么它与整数一起工作?
更新:我正在创建实例并按如下方式读取它:
FooBar obj(5);
//FooBar obj("Hello"); // For strings...
std::cout << obj.rNumber << std::endl;
更新2:如果您传递用户定义的类型,它也可以工作,如下所示:
struct GooBar
{
public:
GooBar(int number) : itsNumber(number)
{
std::cout << "In constructor..." << std::endl;
}
GooBar(const GooBar& rhs) = delete;
GooBar(GooBar&& rhs) = delete;
~GooBar()
{
std::cout << "In destructor..." << std::endl;
}
int itsNumber;
};
struct FooBar
{
FooBar(GooBar&& number) : rNumber(number)
{
}
GooBar& rNumber;
};
然后创建一个实例并像这样读取它:
FooBar obj(GooBar(5));
std::cout << obj.rNumber.itsNumber << std::endl;
我认为这很有趣,因为它提供了以下输出:
In constructor...
In destructor...
5
最佳答案 使用整数文字作为实际参数,编译器可以将引用传递给静态分配的实例.
使用std :: string形式参数和字符串文字作为实际参数,实例在调用中创建,并在调用结束时销毁.
在这两种情况下,它都是未定义的行为.
现在还不清楚你怎么称呼它:你忘了包含那些重要的信息(因为问题是我写这篇文章的时候).