C ++没有调用赋值运算符

时间:2014-12-11 20:46:36

标签: c++ codeblocks

好的,我的代码类型调用赋值运算符。我在Code :: Blocks中尝试过这段代码,效果很好。然而,在Rowley的Crossworks中,它无法工作。两个IDE都使用GCC编译器。这是我的哑课:

template <typename T>
class Iterator {
    public:
        Iterator() { ptr = nullptr; }
        Iterator(const T* p) : ptr(p) {}
        virtual ~Iterator() {}

        // Other stuff

    protected:
        const T* ptr;
};

这是我违规的代码:

void GetStuff()
{
    static Iterator<char> it;
    static char buf[4];

    // Place the data into buf

    it = buf;    /* NOTHING HAPPENS. Indeed no assembly is generated for this line. */

    Send(it, sizeof(buf));    // Where Send() accepts a pointer to an Iterator<char>
}

赋值应该设置Iterator类指向&buf[0]的指针,我假设这是默认赋值运算符使用Iterator(const T* p)重载应该做的事情(至少我认为&#39;应该怎么做。)

为什么不调用默认赋值运算符?为什么根本不生成代码?

编辑:清晰度

4 个答案:

答案 0 :(得分:0)

由于未使用,编译器可能会优化或删除任何内容。如果定义自己的赋值运算符,则编译器无法对其语义进行假设。尝试输入cout或其他东西,这将导致打印。

Iterator& operator=(Iterator rhs) {
    std::cout << "actually assigning\n";
    this->ptr = rhs.ptr;
    return *this;
}

但是你不需要这样做,因为编译器会为你生成更好的代码,无论如何都允许更多的优化(正如你已经发现的那样)

答案 1 :(得分:0)

为了详细说明一些评论,编译器会积极地删除那些没有完成任何事情的语句。其他人已注意到在调试中编译,但即使关闭优化,有时也会发生死代码消除。 (另外,有时它是您想要看到的优化组件 - 当我试图分析小片段时,我会遇到这种情况。)

我有时会使用像这样的小功能,它具有防止被优化的所有保护。只需致电func(it)

template<typename T>
__attribute__((noinline))
void func(volatile const T)
{
    asm ("");
}

这个函数读取:接受任何参数,不做任何操作,不内联此函数,并且它有一个正文,所以不要认为你可以安全地跳过它。但由于参数变量现在已被“使用”,因此它不会被优化掉。

或者可以只是在不同文件中的任何内容,因为您需要启用链接时优化,以便编译器在此时剔除它。

答案 2 :(得分:0)

希望有人能够在某个地方看到并且没有陷入同一个陷阱。问题不在于使用Crossworks工作方式的C ++代码。

我已将代码组织到目录中的srcinc文件夹中。在Crossworks中,我创建了&#34;动态文件夹&#34;据说扫描目录和子目录并更新项目视图。此外,此重新扫描不是自动的。所以这是我的问题:

  1. 创建新的源文件和标头文件,并将它们放入各自的srcinc文件夹中。 Crossworks将这些文件显示为位于根目录中。
  2. 打开Crossworks中的.c.h个文件&#39;编辑器。
  3. 从根目录重新扫描动态文件夹和Remove .c.h。在步骤1中创建的.c.h文件应显示在正确的文件夹中。
  4. 对仍然打开的.c.h文件进行更改。 Crossworks在某种程度上没有对正确的文件进行更改,因为它仍然认为它们位于根中,即使它们是在子目录中创建的,也是为了开始。
  5. 这是我对Crossworks正在做的最好的猜测。我以前一直被这个问题所困扰,并花了好几分钟来解释为什么我的代码没有编译。解决方案是关闭文件,重新扫描动态文件夹,然后再从动态文件夹中打开文件。我希望这会有所帮助。

答案 3 :(得分:-1)

您没有定义赋值运算符。尝试类似:

Iterator & operator = ( const T * p ) { ptr = p; return *this; }