我有一小段无法编译的代码,我想知道更具体的原因为什么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);
}
而且我想知道更具体的原因为什么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引用会导致内存泄漏,但这超出了您的问题范围
当需要引用时,您不能传递指针。 new关键字在堆上创建一个新对象,并返回指向它的指针。
您必须像对待x和y一样。