2016-08-17 6 views
-4
void print_me_bad(std::string& s) { 
     std::cout << s << std::endl; 
    } 

    void print_me_good(const std::string& s) { 
     std::cout << s << std::endl; 
    } 

    std::string hello("Hello"); 

    print_me_bad(hello); // Compiles ok 
    print_me_bad(std::string("World")); // Compile error 
    print_me_bad("!"); // Compile error; 
    print_me_good(hello); // Compiles ok 

    print_me_good(std::string("World")); // Compiles ok 
    print_me_good("!"); // Compiles ok 

В приведенной выше программе конструкторов копирования, почему я получаю ошибки компиляции во втором случае, когда передаю «Мир»?copy constructor дает ошибку компиляции

+3

Временно не может быть привязаны к ссылаться на неконстантный. – songyuanyao

+3

В коде, который вы показываете, нет копии-конструкции. Проблема связана с различием между lvalues ​​и rvalues ​​(в основном, «временными» объектами) и разницей между ссылками на постоянные и непостоянные объекты. –

+0

Привязывание временных объектов к ссылкам (требуется 'const') - https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ – Niall

ответ

0

Как уже упоминалось в комментариях, вы не можете привязывать временные объекты к неконстантным ссылкам.

В следующих случаях:

print_me_bad(std::string("World")); // Compile error 
print_me_bad("!"); // Compile error; 

создается временный объект станд :: строка. Сначала явно (std::string("World")), а затем через неявное преобразование ("!" преобразуется в std :: string). Это запрещено.

Вы можете, однако, связывает с константным временными ссылками, поэтому другие случаи компиляции просто отлично:

print_me_good(std::string("World")); // Compiles ok 
print_me_good("!"); // Compiles ok