Является ли 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, чтобы избежать скуки повторять вещи в списках инициализации, если у вас было несколько конструкторов.


  1. дело в том, что объект должен быть полностью инициализирован, прежде чем тело вашего конструктора сможет приступить к игре с ним. Это означает, что в памяти должно быть зарезервировано достаточно места, в которое будет помещен экземпляр нового объекта.

  2. если вы объявляете элемент данных (int x) к const, вы запрещаете себе когда-либо изменять его значение, после его создания это означает, что значение должно быть установлено во время создание.

в Примере 1 Вы сначала создаете int x и установите его в значение 3 (которое будет находиться в памяти, зарезервированной для вашего объекта), и только после этого тело вашего конструктора выполняется.

в Примере 2, вы создаете новый объект (с некоторым значением для Ваш int x) и чем вы пытаетесь изменить его в конструкторе, который запрещен const ключевое слово.