Tham chiếu dài hạn phải được liên kết với lvalue
. Về cơ bản, như bạn hùng hồn đặt nó, một đối tượng có một địa chỉ xác định. Nếu chúng bị ràng buộc tạm thời sẽ bị phá hủy trong khi tham chiếu vẫn đang tham chiếu nó và kết quả là không xác định.
Tham chiếu const sống ngắn (biến hàm cục bộ và đối số hàm) có thể bị ràng buộc theo thời gian. Nếu có, tạm thời được đảm bảo không bị phá hủy cho đến khi tham chiếu vượt quá phạm vi.
đang
diễn:
#include <iostream>
class Big {
public:
Big() : living_(true), i_(5) { // This initialization of i is strictly legal but
void *me = this; // the result is undefined.
::std::cerr << "Big constructor called for " << me << "\n";
}
~Big() {
void *me = this;
living_ = false;
::std::cerr << "Big destructor called for " << me << "\n";
}
bool isLiving() const { return living_; }
const int &getIref() const;
const int *getIptr() const;
private:
::std::string s_;
bool living_;
const int &i_;
char stuff[50];
};
const int &Big::getIref() const
{
return i_;
}
const int *Big::getIptr() const
{
return &i_;
}
inline ::std::ostream &operator <<(::std::ostream &os, const Big &b)
{
const void *thisb = &b;
return os << "A " << (b.isLiving() ? "living" : "dead (you're lucky this didn't segfault or worse)")
<< " Big at " << thisb
<< " && b.getIref() == " << b.getIref()
<< " && *b.getIptr() == " << *b.getIptr();
}
class A {
public:
A() : big_(Big()) {}
const Big &getBig() const { return big_; }
private:
const Big &big_;
};
int main(int argc, char *argv[])
{
A a;
const Big &b = Big();
const int &i = 0;
::std::cerr << "a.getBig() == " << a.getBig() << "\n";
::std::cerr << "b == " << b << "\n";
::std::cerr << "i == " << i << "\n";
return 0;
}
Và kết quả:
Big constructor called for 0x7fffebaae420
Big destructor called for 0x7fffebaae420
Big constructor called for 0x7fffebaae4a0
a.getBig() == A living Big at 0x7fffebaae420 && b.getIref() == -341121936 && *b.getIptr() == -341121936
b == A living Big at 0x7fffebaae4a0 && b.getIref() == 0 && *b.getIptr() == 0
i == 0
Big destructor called for 0x7fffebaae4a0
Ví dụ cụ thể trong hàm dựng của nó mặc dù vẫn sẽ thất bại thảm hại nếu anh ta khai báo biến thành viên 'const'. – Omnifarious
@Omnifarious: Làm thế nào? – GManNickG
Điều gì xảy ra khi tạm thời 0 bị hủy? Làm thế nào về nếu địa chỉ của nó được thực hiện và dereferenced? – Omnifarious