2017-04-10 107 views
0

你可以看看这个例子代码:返回引用一个const指针为const类型

class Test { 
    int *a; 
    int b; 
public: 
    Test() : b(2) 
    { 
    a = new int(5); 
    } 

    const int * const& GetA() const 
    { 
    const int * const& c = a; 
    return a; 
    } 

    const int& GetB() 
    { 
    return b; 
    } 

    ~Test() 
    { 
    delete a; 
    } 
}; 

我得到回报的警告。为什么将一个const引用的引用返回给一个const变量是错误的,但是可以返回一个const变量的引用吗?顺便说一句,如果我在GetA()中返回c,它编译得很好。

+3

你会得到什么警告? – NathanOliver

+0

无法在VS 2015上重现问题 – alexeykuzmin0

+0

我得到了对临时[-Wreturn-local-addr]的返回引用。 – lepo

回答

1

首先考虑const int& GetB()。这是返回对类成员b的引用的一种简洁的方式,即不能在呼叫站点修改。由于您没有更改任何类成员数据,因此可以将该函数标记为const。这是惯用的C++,特别是对于大于int的类型,例如std::string

当您编写return a;时,您允许函数调用站点通过该指针修改该类成员。虽然C++标准允许这样做,但是它可以避免封装,而且友好的编译器会警告你。请注意,由于该函数本身不是而是更改了类成员,所以编译通过,尽管它被标记为const

写在const int * const& c = a;编译器假定你知道你在做什么。

(最后要注意,所有的浩劫是放开,如果你试图复制的Test实例由于编译器生成的拷贝构造函数浅复制a。你应该delete拷贝构造函数和赋值运算符。)

+0

然而,当我写例如'std :: cout << *(t-> GetA());'我得到一个段错误。但是当我返回c代码工作正常。 – lepo