2017-02-10 14 views
6

Według this stronie, istnieje pięć sposobów przypisywania coś do łańcucha:Mogę przypisać podwójny ciąg?

  string (1) string& operator= (const string& str); 
     c-string (2) string& operator= (const char* s); 
     character (3) string& operator= (char c); 
initializer list (4) string& operator= (initializer_list<char> il); 
      move (5) string& operator= (string&& str) noexcept; 

To dlaczego mogę skompilować poniższy tekst? Które z tych opcji wykorzystał kompilator?

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s; 
    double d = 1.0; 
    s = d; 
    std::cout << s << std::endl; 
} 

I to nie jest po prostu bezsensowne pytanie - Spędziłem długie godziny próbując znaleźć to zadanie s = d w moim kodzie. Oczywiście powinno to być s = std::to_string(d).

Kompilator: GCC 4.8.4.

+1

Co jest drukowany? Czym jest 's'? –

+0

czy naprawdę masz na myśli przydzielić lub masz na myśli ** przekonwertować ** podwójnie na ciąg? – Alex

+0

@Alex - To było zadanie w moim kodzie – HEKTO

Odpowiedz

7

Twój kod jest odpowiednikiem tego kodu:

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s; 
    double d = 1.0; 
    char j = d; 
    s = j; 
    std::cout << s << std::endl; 
} 

Więc będzie wyprowadzać \1 następuje zakończenie linii.

Jeśli używasz G ++, określ -Wconversion, aby przechwytywać takie rzeczy.

f.cpp W funkcji 'int głównym()'
f.cpp: 8: 7: Uwaga: konwersja do 'karbonizatu' z 'podwójne' może zmieniać wartość [-Wfloat konwersji]
s = d;

+0

Ani jedno ostrzeżenie z '-Wall'? Łał. MSVC/W4 mówi: "ostrzeżenie C4244:" argument ": konwersja z" podwójnego "na" zwęglenie ", możliwa utrata danych" – rustyx

+0

@RustyX - tak, skompilowałem za pomocą -Wall – HEKTO

4

on wykonuje tę przemianę: double -> char i konsekwentnie stosuje następującą przeciążeniem:

character (3) string& operator= (char c); 

Przetestowałem to skanowanie wyjścia z od:

> ./a.out | od -c 
0000000 001 \n 
Powiązane problemy