存储右值参考:这应该有用吗?

时间:2013-12-14 17:22:54

标签: c++ c++11 reference undefined-behavior rvalue-reference

我正在通过故意试图破解事物来测试我对左值和左值参考的理解。所以说有这个结构:

struct FooBar
{
    FooBar(int&& number) : rNumber(number)
    {

    }

    int& rNumber;
};

我创建了一个实例FooBar obj(5)。每次尝试读取引用变量都会返回正确的结果(5)。如果我使用const int&代替int&&,也会发生同样的情况。

我注意到用int替换std::string并读取引用返回一个空字符串,所以我怀疑它给出了未定义的行为。是这样吗?如果是这样,为什么它与整数一起工作?

更新:我正在创建实例并按如下方式阅读:

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

1 个答案:

答案 0 :(得分:2)

使用整数文字作为实际参数,编译器可以将引用传递给静态分配的实例。

使用std::string形式参数和字符串文字作为实际参数,实例在调用中创建,并在调用结束时销毁。

在这两种情况下都是未定义的行为。


现在还不清楚你怎么称呼它:你忘了包含那些重要的信息(因为问题是在我写这篇文章的时候)。