2014-07-12 2 views
2

Dans le code suivant, A(100) est un objet temporaire ou une valeur r. Le compilateur n'a pas généré d'erreur lorsqu'une fonction membre a tenté de modifier une variable membre. Les valeurs r sont-elles en lecture seule?Pourquoi les objets de valeur r sont-ils autorisés à être modifiés par le compilateur?

#include <iostream> 

using namespace std; 

class A 
{ 
    int i; 
public: 
    A() {cout << "In default ctor\n";}; 
    A(int v) {cout << "Setting i in par-ctor to " << v << "\n"; i=v;} 
    void print() {cout << "i = " << i << endl;} 
    void seti(int val){i=val;print();} 
}; 

int main() 
{ 
    A(100).seti(200); 

    return(0); 
} 

De plus, s'il est nécessaire d'utiliser const dans les constructeurs de copie pour assurer rvalues ​​ne sont pas modifiés, pourquoi est-ce pas le même cas ici?

+0

'Les valeurs r ne sont-elles pas en lecture seule?' Qui a dit cela? – 101010

Répondre

3

Je ne connais aucune exigence pour les valeurs à lire seulement. Le contraire est vrai, des modifications peuvent être apportées, mais les changements à cet objet seront aussi éphémères que l'objet temporaire lui-même (sa durée de vie pouvant être prolongée avec une référence appropriée).

Un constructeur de copie ne doit pas prendre son argument comme const&, il peut simplement être par une référence non-cv aussi bien (voir http://en.cppreference.com/w/cpp/language/copy_constructor).

un constructeur de copie de classe T est un constructeur non-modèle dont le premier paramètre est T &, const T &, T volatile &, ou T volatile const &

En général, ils ne prennent leur argument comme const& et cela permettra aux objets temporaires d'être utilisés pendant la construction de la copie.

3

Simple: Oui, vous créez un objet temporaire et oui c'est un rvalue. Mais les valeurs ne sont pas en lecture seule :)

Questions connexes