Tôi đã đoạn mã sau:Chuyển đổi char * để chuỗi &
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
string &s1 = argv[0]; // error
const string &s2 = argv[0]; // ok
argv[0] = "abc";
cout << argv[0] << endl; // prints "abc"
cout << s2 << endl; // prints program name
}
tôi nhận được lỗi sau cho s1
:
invalid initialization of reference of type 'std::string& {aka std::basic_string<char>&}' from expression of type 'char*'
Thế thì tại sao các trình biên dịch chấp nhận s2
?
Điều thú vị là khi tôi chỉ định giá trị mới cho argv[0]
thì s2
không thay đổi. Liệu trình biên dịch bỏ qua rằng đó là một tài liệu tham khảo và sao chép giá trị nào? Tại sao nó lại xảy ra?
Tôi viết điều này trong Mã :: Khối 16.01 (mingw). Điều tương tự cũng xảy ra với/không có -std=c++11
.
Bạn có thể nói rằng 'argv [0]' là một 'std :: string'? – Biffen
"Vậy tại sao trình biên dịch lại chấp nhận s2?" vì chuyển đổi tiềm ẩn. http://stackoverflow.com/questions/4553896/conversion-of-char-to-string –