Clang is correct, the key wording in [expr.new]p6 changes from the following in the C++11 draft:
Every constant-expression in a noptr-new-declarator shall be an integral constant expression ([expr.const]) and evaluate to a strictly positive value. The expression in a noptr-new-declarator shall be of integral type, unscoped enumeration type, or a class type for which a single non-explicit conversion function to integral or unscoped enumeration type exists ([class.conv]). If the expression is of class type, the expression is converted by calling that conversion function, and the result of the conversion is used in place of the original expression. …
to this in the C++14 draft:
Every constant-expression in a noptr-new-declarator shall be a converted constant expression ([expr.const]) of type std::size_t
and shall evaluate to a strictly positive value. The expression in a noptr-new-declarator is implicitly converted to std::size_t
. …
In C++14 the requirement for the expression in a noptr-new-declarator was weakened to not require an integral, unscoped enumeration or a class with a
single non-explicit conversion function to one of those types but just allow implicit conversions to size_t.
The change in wording came from the proposal A Proposal to Tweak Certain C++ Contextual Conversions, v3.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…