Có, cả bản sửa đổi mới và báo cáo kỹ thuật đều có nhiều thay đổi đối với nội dung của thư viện chuẩn. Hàm bạn đã tham chiếu (std::string
'Hàm khởi tạo di chuyển ') mới được thêm vào trong thư viện chuẩn của C++ 0x.
Phiên bản của tiêu chuẩn không ảnh hưởng đến tên mangling, mặc dù phiên bản trình biên dịch và trình biên dịch mới hơn là cần thiết để hỗ trợ C++ 0x tốt hơn, vì vậy nó có vẻ liên quan.
Có thể bạn đang sử dụng phiên bản libstdC++ quá cũ.
EDIT: xử lý sự cố cơ bản:
$ find /usr -name libstdc++.a
/usr/lib/gcc/i686-pc-cygwin/4.5.0/libstdc++.a
$ cygcheck -f /usr/lib/gcc/i686-pc-cygwin/4.5.0/libstdc++.a
libstdc++6-devel-4.5.0-1
$ nm -C /usr/lib/gcc/i686-pc-cygwin/4.5.0/libstdc++.a | grep basic_string | grep '&&'
00000000 T std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&)
00000000 T std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&)
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::assign(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator=(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
này thực sự trông hơi buồn cười. Các định nghĩa cho std::wstring
(ví dụ: std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >
) trông chính xác, các phiên bản thu hẹp thì không. Tên std::string
không bao giờ nên tồn tại trong giai đoạn mangling, vì nó chỉ là một typedef.
Tuy nhiên, tôi nhận được đầu ra tương tự trên linux:
% find /usr -name libstdc++.a
/usr/lib64/gcc/x86_64-pc-linux-gnu/3.4.6/libstdc++.a
/usr/lib64/gcc/x86_64-pc-linux-gnu/3.4.6/32/libstdc++.a
/usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.2/libstdc++.a
/usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.2/32/libstdc++.a
% nm -C /usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.2/libstdc++.a | grep basic_string | grep '&&'
0000000000000000 W std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&)
0000000000000000 W std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&)
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::assign(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator=(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
Có điều gì đó sai trái với văn bản lỗi của bạn. Bạn đã trích dẫn nó trực tiếp? Nó không có ý nghĩa gì cả. –
@Noah: Bạn đang đề cập đến "&&"? Nó trông giống như ký hiệu tham chiếu rvalue từ C++ 0x. –