Что означает это предложение в §3.2 / 2 стандарта C ++ 11?

Предложение является частью пункта § 3.2 / 2:

Переменная, имя которой появляется в качестве потенциально оцениваемого выражения:
Odr-используется, если это объект, который удовлетворяет требованиям для
появляется в константном выражении (5.19) и lvalue-to-rvalue
преобразование (4.1) применяется немедленно
.

Что именно означает выделенное жирным шрифтом предложение выше?

редактировать:

Ответ на вопрос, который считается дубликатом, не говорит ничего, что могло бы ответить на мой вопрос.

6

Решение

Это означает, что когда вы используете константу в качестве константы, это как если бы вы использовали константу.

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;
7

Другие решения


По вопросам рекламы [email protected]