Предложение является частью пункта § 3.2 / 2:
Переменная, имя которой появляется в качестве потенциально оцениваемого выражения:
Odr-используется, если это объект, который удовлетворяет требованиям для
появляется в константном выражении (5.19) и lvalue-to-rvalue
преобразование (4.1) применяется немедленно.
Что именно означает выделенное жирным шрифтом предложение выше?
редактировать:
Ответ на вопрос, который считается дубликатом, не говорит ничего, что могло бы ответить на мой вопрос.
Это означает, что когда вы используете константу в качестве константы, это как если бы вы использовали константу.
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: ошибка: неопределенная ссылка на 'S :: i' collect2: error: ld вернул 1 состояние выхода
Чтобы это работало, необходимо предоставить определение, например, так:
struct S {
static const int i = 0;
};
const int S::i;