struct A {
A(int) : i(new int(783)) {
std::cout << "a ctor" << std::endl;
}
A(const A& other) : i(new int(*(other.i))) {
std::cout << "a copy ctor" << std::endl;
}
~A() {
std::cout << "a dtor" << std::endl;
delete i;
}
void get() {
std::cout << *i << std::endl;
}
private:
int* i;
};
const A& foo() {
return A(32);
}
const A& foo_2() {
return 6;
}
int main()
{
A a = foo();
a.get();
}
Tôi biết, việc trả lại tham chiếu đến các giá trị cục bộ là xấu. Nhưng, mặt khác, tham chiếu const nên kéo dài tuổi thọ đối tượng tạm thời.Điều gì xảy ra chính xác khi trả về tham chiếu const cho một đối tượng cục bộ?
Mã này tạo ra kết quả UB. Vì vậy, không có sự sống.
Tại sao? Tôi có nghĩa là ai đó có thể giải thích những gì đang xảy ra từng bước?
Lỗi trong chuỗi lý do của tôi ở đâu?
foo():
A (32) - ctor
trở lại A (32) - một tham chiếu const đối tượng địa phương được tạo ra và được trả về
A a = foo(); - a được khởi tạo bởi giá trị trả về foo(), giá trị trả về nằm ngoài phạm vi (ngoài biểu thức) và bị hủy, nhưng đã được khởi tạo;
(Nhưng trên thực tế destructor được gọi là trước khi copy constructor)
foo_2():
trở lại 6 - đối tượng tạm thời loại A được tạo ra ngầm, một tham chiếu const để đối tượng này được tạo (kéo dài tuổi thọ của nó) và được trả lại
A a = foo(); - a được khởi tạo bởi giá trị trả về foo(), giá trị trả về nằm ngoài phạm vi (ngoài biểu thức) và bị hủy, nhưng đã được khởi tạo;
(Nhưng trên thực tế destructor được gọi là trước khi copy constructor)
"tham chiếu const nên kéo dài tuổi thọ đối tượng tạm thời" <- erm, không khi nói đến tham chiếu không const và const đối tượng suốt đời và bằng * không * mở rộng nó. – Giel
Tôi nghĩ đây là những gì Alexander nói về việc kéo dài tuổi thọ: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ – vmpstr
@Giel: Không. Tham chiếu Const ** có thể ** kéo dài tuổi thọ của đối tượng tạm thời. Tham chiếu Const và non-const khá khác nhau khi nói đến việc làm việc với các thời gian. Trong trường hợp này, nó hoạt động khác với những gì mà OP có vẻ mong đợi. – AnT