C++ 具有引用成员的内部类中的默认赋值运算符

C++ 具有引用成员的内部类中的默认赋值运算符,c++,reference,assignment-operator,C++,Reference,Assignment Operator,我遇到了一个我不理解的问题,我希望这里的人能提供一些见解。简化代码如下(原始代码是一个自定义队列/队列迭代器实现): 在编译时,这会给我以下错误: foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)': foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator

我遇到了一个我不理解的问题,我希望这里的人能提供一些见解。简化代码如下(原始代码是一个自定义队列/队列迭代器实现):

在编译时,这会给我以下错误:

foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)':
foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator
foo.cpp: In function 'int main()':
foo.cpp:63: note: synthesized method 'B::C& B::C::operator=(const B::C&)' first required here
我可以使用两个单独的C变量来解决这个问题,因为它们应该是独立的“C”对象,但这只会隐藏问题(我仍然不明白为什么我不能这样做)


我想原因是参考资料不能复制,但我不明白为什么。我需要提供我自己的赋值运算符和复制构造函数吗?

给定初始值后,引用不能更改。这意味着不可能编写更改引用成员值的赋值运算符。如果需要这样做,请使用指针而不是引用。

此问题与内部类无关。在C++中,你不能(重新)分配引用——它们需要在定义时被初始化。 一个简单的例子是:

class B
{
public:
    B(int& i) : ir(i) {};

    int& ir;
};


int main()
{
    int i;
    B b(i);      // Constructor - OK

    int j;
    B bb = B(j); // Copy constructor - OK

    bb = b;      // Assignment - Error
    return 0;
}

C++没有“内部类”,只有嵌套的类声明。“内部类”是一种Java ism,我认为在其他主流语言中找不到。在Java中,内部类是特殊的,因为它们包含对包含类型的对象的隐式不可变引用。要实现与Java中C++嵌套声明的等价性,需要使用静态内部类;静态内部类不包含对声明类型的对象的引用。

实际上,有一个解决方案。你可以,而且它会起作用:)这是一种非常适合这种情况的技术。假设你真的想支持这项任务。

Bah,你当然是对的,我不敢相信我错过了显而易见的解释。早上应该多喝点咖啡:D+1。我发现在谈论引用时习惯性地使用“bind”而不是“assign”可以帮助我避免犯这个错误;int b=4;int&ref=a;ref=b;。因此,重新分配引用是可能的,实际上是可能的。查看我下面的评论以了解详细信息。在赋值运算符中调用析构函数是一种非常糟糕的编程习惯。首先感谢您的回答,我自己已经找到了这个解决方案,但忽略了自赋值检查和显式析构函数调用。您注意到您不建议使用它(我同意您的推理),鉴于这些缺点,是否有首选实现?您的链接已断开,现在您的答案无效。
class B
{
public:
    B(int& i) : ir(i) {};

    int& ir;
};


int main()
{
    int i;
    B b(i);      // Constructor - OK

    int j;
    B bb = B(j); // Copy constructor - OK

    bb = b;      // Assignment - Error
    return 0;
}