2016-09-27 4 views
-2

En fouillant dans MSDN, je suis tombé juste une autre ligne curieuse:Quel est l'effet de const au début d'une déclaration de fonction non-membre?

// This function returns the constant string "fourth". 
const string fourth() { return string("fourth"); } 

L'exemple complet est enterré ici: https://msdn.microsoft.com/en-us/library/dd293668.aspx raffiné à nu minimum, il ressemble à ceci:

#include <iostream> 

const int f() { return 0; } 

int main() { 
    std::cout << f() << std::endl; 

    return 0; 
} 

Quelques autres tests avec différents types de retour ont démontré que Visual Studio et g ++ compilent des lignes comme ça sans avertissement, mais le qualificatif const semble n'avoir aucun effet sur ce que je peux faire avec le résultat. Quelqu'un peut-il donner un exemple de ce qui compte?

+0

Copie possible de [Dois-je renvoyer des objets const?] (Http://stackoverflow.com/questions/12051012/should-i-return-const-objects) – Sergey

Répondre

1

Il fait partie du type de retour. Les fonctions renvoient const string et const int.

Dans le cas de const int, cela fait en effet aucune différence par rapport à int, parce que la seule chose que vous pouvez faire avec une valeur de retour int est de copier la valeur quelque part (en fait, la norme indique explicitement que const n'a pas d'effet ici).

Dans le cas de const string, il fait une différence, car une valeur de retour de type classe peut avoir des fonctions membres lui eut demandé:

fourth().erase(1); 

échouera à compiler dans le cas où fourth() retourne un const string , car erase() n'est pas une méthode const (il essaie de modifier le string sur lequel il est appelé). Personnellement, je ne fais jamais de valeurs retournant la valeur const, car elle contraint inutilement l'appelant (bien que certaines personnes estiment qu'il est utile d'éviter d'écrire des choses comme string s = fourth().erase(1);).

2

vous ne pouvez pas modifier l'objet retourné

exemple:

#include <string> 
using namespace std; 

const string foo(){return "123";} 
string bar(){return "123";} 

int main(){ 
    //foo().append("123"); //fail 
    bar().append("123"); //fine 
} 

C'est presque la même que la variable const

#include <string> 
using namespace std; 

const string foo = "123"; 
string bar = "123"; 

int main(){ 
    //foo.append("123"); //fail 
    bar.append("123"); //fine 
}