Является ли modify const в конструкторе c++ стандартным?
является ли modify const в конструкторе c++ standard? Я модифицировал свой struct
удаление фиксированных значений (инициализатор элемента по умолчанию), чтобы установить его позже, во время конструктора, но я забыл удалить const
сайта и noticied его позже. К моему удивлению, я не получил ошибку компиляции, она просто работала нормально, но для тестового случая 2 она дает компилятор. Чем они отличаются?
тестовый пример 1:
struct A
{
const int x = 2;
A()
: x(3)
{
}
};
тестовый пример 2:
struct A
{
const int x = 2;
A()
{
x = 3; // compile error! error: read-only variable is not assignable
}
};
3 ответов
в первом примере вы инициализации постоянная переменная, во втором вы присвоить значение к нему, после того как переменная построена по умолчанию. Это разные операции, и назначение констант после их инициализации невозможно.
этот синтаксис был добавлен в C++11:
struct A
{
const int x = 2;
в этом случае 2
похоже на значение "по умолчанию", которое будет использоваться для инициализации x
. Если вы инициализируете x
в списке инициализации конструктора, то используется значение. Однако если вы этого не сделали, то есть.
Это было добавлено в C++11, чтобы избежать скуки повторять вещи в списках инициализации, если у вас было несколько конструкторов.
дело в том, что объект должен быть полностью инициализирован, прежде чем тело вашего конструктора сможет приступить к игре с ним. Это означает, что в памяти должно быть зарезервировано достаточно места, в которое будет помещен экземпляр нового объекта.
если вы объявляете элемент данных (
int x
) кconst
, вы запрещаете себе когда-либо изменять его значение, после его создания это означает, что значение должно быть установлено во время создание.
в Примере 1 Вы сначала создаете int x
и установите его в значение 3 (которое будет находиться в памяти, зарезервированной для вашего объекта), и только после этого тело вашего конструктора выполняется.
в Примере 2, вы создаете новый объект (с некоторым значением для Ваш int x
) и чем вы пытаетесь изменить его в конструкторе, который запрещен const
ключевое слово.