Un temporaneo esplicito di un tipo integrale si qualifica come espressione costante integrale?

2

Nel seguente codice, int() è una conversione di tipo esplicita.

#include <iostream>

int main() 
{
    void* ptr = int(); 
    return 0;
}

Clang Compiler:

source_file.cpp:5:11: error: cannot initialize a variable of type 'void *' with an rvalue of type 'int'
    void* ptr = int(); 
      ^     ~~~~~

Compilatore GCC:

Working fine.

Quindi, quale compilatore è corretto?

e, un temporaneo esplicito di un tipo integrale si qualifica come espressione di una costante integrale?

    
posta Jemes 13.10.2017 - 13:18
fonte

1 risposta

6

Sì, un temporaneo esplicito come int() può essere un'espressione costante integrale (a condizione, ovviamente, che sia effettivamente costante). Questa è un'aringa rossa.

Le tue versioni (e flag) di Clang e GCC sembrano implementare il comportamento costante del puntatore nullo rispettivamente da C ++ 03 e C ++ 11. Lo standard afferma che un puntatore null letterale, adatto per inizializzare il void* , è:

  • C ++ 03 : [conv.ptr] "un valore di espressione costante integrale del tipo intero che valuta zero ", ad esempio 0 , int() o (1 - 1) ;
  • C ++ 11 (in poi): [conv.ptr] "un intero letterale con valore zero " ("o un valore di tipo std :: nullptr_t"), che lascia solo un 0 effettivo come int -to- void* candidato alla conversione.

In ogni caso, ciò che dovresti usare per inizializzare i puntatori nulli è nullptr .

    
risposta data 13.10.2017 - 15:29
fonte

Leggi altre domande sui tag