2009-03-19 32 views
6

gì xảy ra ở đây:Điều gì sẽ xảy ra khi chuyển tham chiếu đến chữ trong C++?

double foo(const double& x) { 
    // do stuff with x 
} 

foo(5.0); 
  1. Liệu trình biên dịch tạo ra một biến ẩn danh và đặt giá trị của nó đến 5.0?
  2. Liệu x có tham chiếu đến vị trí bộ nhớ trong bộ nhớ chỉ đọc không? Đây là một phân nhịp lạ, tôi biết ...

chỉnh sửa: Tôi quên từ khóa const ...

Trả lời

6

Biến tạm thời được tạo cho mục đích này và nó thường được tạo trên ngăn xếp.

Bạn có thể thử const_cast, tuy nhiên dù sao thì bạn cũng không thể truy cập một biến khi hàm trả về.

+0

Điều này có vẻ rất không hiệu quả đối với tôi. Nó sẽ không được tốt hơn để chỉ cần tạo một vị trí bộ nhớ trong phân khúc chỉ đọc với giá trị khai báo và sử dụng nó thay vì tạo một biến trên ngăn xếp? Tất cả đằng sau hậu trường, tất nhiên ... –

+0

Đó là thực hiện phụ thuộc anyway. Và gấp đôi không phải là lớn. – sharptooth

+0

Tạo biến tạm thời cũng tốt cho các đối tượng. Thay vì gấp đôi nếu nó là một Class thì một đối tượng tạm thời sẽ được tạo và constructor của nó cũng sẽ được gọi. –

1
  1. trình biên dịch gì có thể làm tạo const theo nghĩa đen, nhưng đó không phải là một biến.
  2. Tham chiếu không phải const không thể trỏ đến chữ.

    $ g ++ test.cpp test.cpp: Trong chức năng int main()': test.cpp:10: error: invalid initialization of non-const reference of type 'double&' from a temporary of type 'double' test.cpp:5: error: in passing argument 1 of foo đôi (double &)'

test.cpp:

#include <iostream> 

using namespace std; 

double foo(double & x) { 
    x = 1; 
} 

int main() { 
    foo(5.0); 

    cout << "hello, world" << endl; 
    return 0; 
} 

Mặt khác, bạn có thể vượt qua một tham chiếu chữ đến tham chiếu const như sau. test2.cpp:

#include <iostream> 

using namespace std; 

double foo(const double & x) { 
    cout << x << endl; 
} 

int main() { 
    foo(5.0); 

    cout << "hello, world" << endl; 
    return 0; 
} 
Các vấn đề liên quan