Это означает, что когда вы используете константу как константу, это точно так же, как если бы вы действительно использовали константу.
struct S {
static const int i = 0;
};
int main() {
return S::i;
}
Хотя у S::i
есть инициализатор, у него нет определения, но текст в вашем вопросе делает специальное исключение для подобных случаев, когда S::i
доступен только для его значения. В этом случае определение не требуется.
С другой стороны, другие варианты использования требуют определения:
struct S {
static const int i = 0;
};
int f(const int &i) {
return i;
}
int main() {
return f(S::i);
}
Эта программа недействительна и принимается некоторыми реализациями, но отвергается другими. Вызов f
требует существования фактического определения S::i
, хотя, если f
будет встроен, отсутствие определения может остаться незамеченным.
В моей системе, если скомпилировать и связать вторую программу без оптимизации, я получаю:
$ g++ test2.cc -o test2
/tmp/ccdEsfxs.o:test2.cc:function main: error: undefined reference to 'S::i'
collect2: error: ld returned 1 exit status
Чтобы заставить его работать, необходимо предоставить определение, например:
struct S {
static const int i = 0;
};
const int S::i;
person
Community
schedule
06.05.2014