Domanda

Dopo un'ampia lettura di ISO/IEC 14882, Linguaggio di programmazione – C++ Non sono ancora sicuro del perché const è necessario per la conversione implicita in un tipo definito dall'utente con un costruttore a argomento singolo come il seguente

#include <iostream>

class X {
public:
   X( int value ) {
      printf("constructor initialized with %i",value);
   }
}

void implicit_conversion_func( const X& value ) {
   //produces "constructor initialized with 99"
}

int main (int argc, char * const argv[]) {
   implicit_conversion_func(99);
}



A partire dalla sezione 4 riga 3

Un'espressione e può essere convertita implicitamente in un tipo T se e solo se la dichiarazione T t=e;è ben formato, per alcune variabili temporanee inventate t (8.5).Alcuni costrutti linguistici richiedono che un'espressione venga convertita in un valore booleano.Un'espressione e che appare in un tale contesto si dice che sia contestualmente convertita in bool ed è ben formata se e solo se la dichiarazione bool t(e);è ben formato, per alcune variabili temporanee inventate t (8.5).L'effetto di entrambe le conversioni implicite è lo stesso dell'esecuzione della dichiarazione e dell'inizializzazione e quindi dell'utilizzo della variabile temporanea come risultato della conversione.Il risultato è un lvalue se T è un tipo di riferimento lvalue (8.3.2) e un rvalue altrimenti.L'espressione e viene utilizzata come lvalue se e solo se l'inizializzazione la utilizza come lvalue.

Successivamente ho trovato la sezione sugli inizializzatori relativa ai tipi definiti dall'utente in 8.5 riga 6

Se un programma richiede l'inizializzazione predefinita di un oggetto di tipo T qualificato const, T sarà un tipo di classe con un costruttore predefinito fornito dall'utente.

Alla fine sono arrivato alla riga 12.3 2 sulle conversioni definite dall'utente che afferma

Le conversioni definite dall'utente vengono applicate solo dove non sono ambigue (10.2, 12.3.2).

Inutile dire che 10.2 e 12.3.2 non hanno risposto alla mia domanda.

  1. Qualcuno può far luce su quale effetto const ha sulle conversioni implicite?
  2. Fa l'uso di const rendere la conversione "non ambigua" per 12.3 riga 2?
  3. Fa const in qualche modo influenzano lvalue vs.rvalue di cui si è parlato nella sezione 4?
È stato utile?

Soluzione

In realtà non ha molto a che fare con la conversione in corso implicito.Inoltre, non ha molto a che fare con conversioni.Si tratta davvero valori contro lvalues.

Quando ti converti 99 digitare X, il risultato è un valore.In C++ i risultati delle conversioni sono sempre valori (a meno che non si converta in un tipo di riferimento).In C++ è illegale allegare riferimenti non const agli rvalue.

Ad esempio, questo codice non verrà compilato

X& r = X(99); // ERROR

perché tenta di allegare un riferimento non const a un rvalue.D'altra parte, questo codice va bene

const X& cr = X(99); // OK

perché è perfettamente corretto allegare un riferimento const a un rvalue.

La stessa cosa accade anche nel tuo codice.Il fatto che implichi una conversione implicita non è questo il punto.È possibile sostituire la conversione implicita con una esplicita

implicit_conversion_func(X(99));

e finisci con la stessa situazione:con const compila, senza const non è così.

Ancora una volta, l'unico ruolo che la conversione (esplicita o implicita) gioca qui è che ci aiuta a produrre un rvalue.In generale, puoi produrre un valore in qualche altro modo e riscontrare lo stesso problema

int &ir = 3 + 2; // ERROR
const int &cir = 3 + 2; // OK

Altri suggerimenti

Per sezione 5.2.2 comma 5, quando un argomento di una funzione è di tipo riferimento const, una variabile temporanea viene introdotta automaticamente se necessario. Nel tuo esempio, il risultato di rvalue X(99) deve essere messo in una variabile temporanea in modo che la variabile può essere passato da const riferimento alla implicit_conversion_func.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top