Я читаю учебник по C ++ Липпмана, где на стр. 303 они дают это:
class Account {
private:
static constexpr int period = 30;
double daily_tbl[period];
}
Если член используется только в контекстах, где компилятор может подставить значение члена, то инициализированная статическая константа или constexpr не требует отдельного определения. Однако, если мы используем член в контексте, в котором значение не может быть заменено, тогда должно быть определение для этого члена.
Также:
Например, если мы передаем Account :: period функции, которая принимает const int &, тогда необходимо определить период.
Поэтому я попробовал добавить такую функцию:
class Account {
private:
static constexpr int period = 30;
double daily_tbl[period];
void foo(const int &i) { ; }
void bar() { foo(period); } //no error?
};
Там я добавил функцию, которая принимает const int &. Я также не добавил никакого определения для переменной периода. Но все равно я не получаю ошибки, так как они сказали, что я должен получить. Почему нет?
1 ответ
Нарушение этого правила не требует диагностики. Таким образом, поведение фактически не определено.
Я думаю, что причина, по которой это не требуется для диагностики, заключается в том, что диагностику будет давать компоновщик. И когда компилятор оптимизирует доступы (как это, вероятно, произошло в этом случае), компоновщик больше не может заметить ничего неправильного. По-прежнему замечая эту ошибку, потребуется анализ всей программы в компоновщике, чтобы он имел доступ к исходному неоптимизированному представлению исходного кода. Это увеличивает время компиляции и требует продвинутого компоновщика и компилятора.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
period
классифицирует как контекст, в котором значение не может быть заменено компилятором? Похоже ли это на обоснование получения адреса инициализированного статического члена класса, что означает, что объект должен быть помещен в какое-то место в памяти, а не просто оптимизирован? Как так?