2016-09-20 2 views
3

J'ai une question pour l'impression de texte à l'écran. Je pense qu'il n'y a pas d'opérateur "+" valide pour le streaming de texte. pourquoi est-ce valable:validité de l'opérateur "+" lors de l'utilisation de "<<"

std::cout << ("print this number " + boost::lexical_cast<std::string>(5) + ". ") << std::endl; 

bien qu'il y ait erreur complie pour cela:

std::cout << ("print this number " + "5" + ". ") << std::endl; 

erreur: opérandes invalides de types de const char [19] 'et 'const char [2]' à binaire 'opérateur +'

J'utilise gcc 4.7.3 et C++ 03.

+0

vous utilisez l'opérateur '+' si un objet chaîne. Notez la parenthèse – Hayt

+0

'operator +' pour 'std :: string:' est utilisé ici. Qu'est-ce qui ne va pas? – ilotXXI

Répondre

6

boost::lexical_cast renvoie std::string qui a operator +(const char *, const std::string&) et operator +(const std::string&, const char *) défini pour cela. Donc, votre code devient équivalent à:

std::cout << std::string("print this number 5. ") << std::endl; 

Il n'y a pas invocation de operator + avec std::ostream arguments.

Dans votre deuxième ligne vous essayez d'ajouter des tableaux de caractères (const char [19] et const char [2] par exemple), ce qui est une erreur par les règles de langage.

0

De toute évidence, le + est exécuté avant le << - seul par l'application de la parenthèse. L'opérateur + s'applique aux chaînes qui l'entourent, alors pourquoi cela ne fonctionnerait-il pas?

3

C'est parce que l'expression entre parenthèses est évaluée en premier.

Le type de boost::lexical_cast<std::string>(5) est std::string. Cela a surchargé opérateurs + pour const char* (sur les deux côtés), qui renvoient un std::string.

Ainsi, le typede l'expression entre parenthèses est un std::string, et le courant a une surcharge << pour elle.

Enfin "print this number " + "5" + ". " ne compilera pas depuis + n'a aucun sens pour const char[] arguments, même si elles la carie aux types pointeur.

0

Ceci n'a absolument rien à voir avec le streaming. Il s'agit simplement de la validité de "print this number " + boost::lexical_cast<std::string>(5) + ". " par rapport à "print this number " + "5" + ". ".

La raison pour laquelle le premier fonctionne est que la deuxième partie est un std::string, pas un littéral de chaîne. Operator + fonctionne pour concaténer std::string s ensemble ou pour un mélange d'objets chaîne et littéraux chaîne (chaînes de style C), mais pas pour les chaînes de style C pur comme dans la deuxième expression.