发送期望获得引用的对象时发生编译错误

问题描述 投票:0回答:2

我有一小段无法编译的代码,我想知道更具体的原因为什么push(new X)是问题?

[在此之前,我想问一下新的X(无标识符)的真正含义是什么?是否创建没有标识符名称的对象X?它完全通过构造函数吗?

其次,

我可能不理解整个概念,但是push是模板类,对吗?由于它包含静态T堆栈,因此类型T是一致的,并且一旦发送了特定参数(即第一个参数,在本例中为int x)就无法更改。正确吗?

第三,在我的第二个问题之后,如果正确,那么为什么push(y)不像push(new X)那样标记编译器错误?我的意思是,x是int类型,y是引用类型。

[如果有人能为我澄清,我将不胜感激。

谢谢,这里是:

    #include <iostream>

    using namespace std;

    template <class T>
    void push(T &t) {
    static const int CAPACITY = 20;
    static T stack[CAPACITY];
    static int size = 0;
    stack[size++] = t;
    cout << size;
    };
   class X {};

   void main()
   {
   int x = 3;
   int &y = x;
   push(x);
   push(new X);
   push(y);
 }
c++ compilation pass-by-reference
2个回答
1
投票

而且我想知道更具体的原因为什么push(new X)是问题?

因为您将模板函数参数的类型声明为对T的非常量左值引用。为了帮助程序员避免错误的代码语言,不允许将临时对象绑定到非const左值引用。您的情况:

new X

返回类型为X *的临时变量(指向X的指针),在这种情况下,模板函数参数类型T推导为X *,现在t是对X *X *&的左引用不允许将临时绑定到左值引用hense编译错误。您的第二种情况在逻辑上等于此代码:

 void pushX( X *&t ); // pushX accepts reference to pointer to X

 pushX( new X ); // you cannot bind a temporary returned by `new X` to lvalue reference `t`

如果您使用简单的类型,例如int,可能会更容易理解:

int function_returns_int();

void push_int( int &ri );


push_int( function_returns_int() ); // compilation error, function_returns_int() returns temporary

有关参考的详细信息,以及为什么可以通过int &y以及为什么t在这种情况下不能作为参考的参考,您可以找到here

注意:如果您进行编译,您的代码(例如,将t的类型更改为const引用会导致内存泄漏,但这超出了您的问题范围


-1
投票

当需要引用时,您不能传递指针。 new关键字在堆上创建一个新对象,并返回指向它的指针。

您必须像对待x和y一样。

© www.soinside.com 2019 - 2024. All rights reserved.