Trong khi hỏi this question, tôi đã học tham chiếu const đến một đối tượng tạm thời là hợp lệ trong C++:const tham chiếu đến một đối tượng tạm thời bị phá vỡ sau khi phạm vi chức năng (thời gian sống)
int main()
{
int a = 21;
int b = 21;
//error: invalid initialization of non-const reference
//int & sum = a + b;e [...]
//OK
int const & sum = a + b;
return sum;
}
Nhưng trong ví dụ sau, const tham chiếu refnop
dùng để chỉ đối tượng tạm thời bị hủy. Tôi tự hỏi tại sao?
#include <string>
#include <map>
struct A
{
// data
std::map <std::string, std::string> m;
// functions
const A& nothing() const { return *this; }
void init() { m["aa"] = "bb"; }
bool operator!= (A const& a) const { return a.m != m; }
};
int main()
{
A a;
a.init();
A const& ref = A(a);
A const& refnop = A(a).nothing();
int ret = 0;
if (a != ref) ret += 2;
if (a != refnop) ret += 4;
return ret;
}
Được thử nghiệm bằng GCC 4.1.2 và MSVC 2010, trả về 4;
$> g++ -g refnop.cpp
$> ./a.out ; echo $?
4
Sự khác biệt giữa ref
và refnop
là cuộc gọi đến nothing()
mà không thực sự không có gì. Có vẻ như sau cuộc gọi này, vật thể tạm thời bị phá hủy!
Câu hỏi của tôi:
Tại sao trong trường hợp refnop
, thời gian sống của đối tượng tạm thời không giống như tham chiếu const?
Chú ý: sử dụng g ++ phiên bản 4.4 và 4.6, đoạn mã này trả về 0 ... – olibre