N3690 does define the term "core constant expression in 5.19p2 [expr.const]:
A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:
[list omitted]
The released ISO C++ 2011 standard defines it in the same section.
As for whether that's actually a definition, see also section 1.3, paragraph 3:
Terms that are used only in a small portion of this International Standard are defined where they are used and italicized where they are defined.
The standard also uses italics for syntactic categories such as conditional-expression, but "core constant expression" is a defined term, not a syntactic category (it's subtle, but you can tell by the use of spaces rather than hyphens to separate the words).
As for the sample code:
const double x = 2.;
constexpr double y = x;
my reading of the standard is that this is invalid, because x
is not a core constant expression. It would be valid if x
and y
were of some integer or enumeration type, but there's no such permission for floating-point. An lvalue-to-rvalue conversion (converting the name of the object x
to its value 2.0
) is not permitted in a core constant expression unless it meets one of three listed criteria (see C11 5.19, 9th bullet, three sub-bullets).
This implies that the compilers that accept the above code without a diagnostic are non-conforming (i.e., buggy). (Unless I'm missing something, which is entirely possible.)
Which implies that http://en.cppreference.com/w/cpp/language/constant_expression is wrong. It says that a core constant expression may contain an lvalue-to-rvalue conversion of an lvalue that "has literal type and refers to an object defined with a constant expression (or to its subobject)". The actual standard has a stronger requirement: the object must be defined with constexpr
. (Perhaps cppreference.com was based on an earlier draft?)
So the sample code could be made valid by changing it to:
constexpr double x = 2.;
constexpr double y = x;