Hello.
Вычитал в стандарте следующий пункт:
9.4.2.4
If a static data member is of const integral or const enumeration type, its declaration in the class
definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
scope if it is used in the program and the namespace scope definition shall not contain an initializer.
У меня статический член данных шаблона. То есть написать вот так будет
недостаточно ?
template <typename T>
class A
{
static int const x = 123;
};
Нужно обязательно явно определять ?
template <typename T>
class A
{
static int const x = 123;
};
template <typename T>
int const A<T>::x;
Но MSVC 7.1
в режиме MS extensions проглатывает только первый случай, а без —
только второй... Как же все таки правильно ?
--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Вопрос-то, собственно, в чем? Если нужно определение, то нужно определение. Определение будет без инициализатора.
Hello, Lorenzo_LAMAS, you wrote:
> Вопрос-то, собственно, в чем? Если нужно определение, то нужно определение. Определение будет без инициализатора.
Вопроса 2:
1) правильно ли я понял стандарт ?
2) не баг ли это MSVC ?
--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Если статические константы объявлены с инициализатором в классе, то при определении инициализатора быть уже не может.
Hello, Lorenzo_LAMAS, you wrote:
> Если статические константы объявлены с инициализатором в классе, то при
> определении инициализатора быть уже не может.
Но само определение обязательно должно присутствовать ?
Или объявления может быть достаточно ?
--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
The member shall still be defined in a namespace
scope if it is used in the program
+
3.2/2
An expression is potentially evaluated unless it appears where an integral constant expression is required
(see 5.19), is the operand of the sizeof operator (5.3.3), or is the operand of the typeid operator and
the expression does not designate an lvalue of polymorphic class type (5.2.8). An object or non-overloaded
function is used if its name appears in a potentially-evaluated expression.