c++ - 存储右值引用 : should this work?

标签 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

最佳答案

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

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

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


虽然不清楚您是如何调用它的:您忘记包含该关键信息(因为问题就在我写这篇文章的时候)。

关于c++ - 存储右值引用 : should this work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20586070/

相关文章:

自定义异常类的 C++ 语法

c++ - 如何使用新语法

c++ - 将字符串文字转换为 std::array 的函数模板

c++ - 如何解决此 "cast to pointer from type of different size"警告?

c++ - 混合基类的虚拟和非虚拟继承

c++ - OpenCV:代码执行无法继续,DLL 丢失

c++ - std::partition 分割对象类型的 vector 时出错

c++ - 将 C++ 共享指针的别名构造函数与空共享指针一起使用

perl - 方括号在Perl中遵循以下推式语法表示什么?

php - 返回值与传递对象引用