salir - personalizar dev c++
En C++, ¿el alcance de un parámetro con nombre incluye la expresión para su valor predeterminado? (2)
Desde basic.scope.pdecl/1 :
El punto de declaración para un nombre es inmediatamente después de su declarador completo y antes de su inicializador (si lo hubiera), excepto como se indica a continuación.
Ejemplo:
unsigned char x = 12; { unsigned char x = x; }
Aquí el segundo
x
se inicializa con su propio valor (indeterminado).
Clang es consistente con esta sección de la norma. GCC solo parece aplicarlo en {block}
.
Dado:
constexpr int d() {return 42;}
Lo siguiente falla en Clang, pero funciona en GCC:
static int e(int d = d()) {return d;}
// This ^^d should refer to the new name that shadows ::d()
Lo siguiente falla tanto en Clang como en GCC:
void func(){
int d = d();
// ^^d here refers to the new name that shadowed ::d();
}
Ejemplo: ¿Es esto legal C ++ 14?
#include <iostream>
static int d() {
return 42;
}
static int e(int d = d()) {
return d;
}
int main() {
std::cout << e() << " " << e(-1) << std::endl;
}
g ++ 5.4 con -std=c++14
le gusta, pero clang ++ 3.8 con -std=c++14
queja:
samename.cxx:3:23: error: called object type ''int'' is not a function or function pointer
static int e(int d = d()) {return d;}
~^
Parece que no es legal: consulte la especificación de C ++ 14 ( sección 3.3.2 - Punto de declaración ).
int x = 5;
{ int x = x; } // second x is initialized with its own undetermined state
{ int x[x]; } // declares an array with 5 elements, since the declaration of
// second x is not complete when the first x is used
En su caso, la declaración de d
está completa, por lo que cuando usa d()
se refiere a la variable, no a la función.