Когда-то было другое поведение. Что мешает сначала сделать инициализацию структуры, а затем запустить конструктор?
Инициализирующая последовательность не подразумевает запуск конструктора (и наоборот). У конструктора как правило свой список инициализации, поэтому может возникать путаница, если сделать как Вы предлагаете:
struct A {
A() : i( 1 ) {}
constint i;
};
voidOnStart()
{
A a = { 2 }; Print( a.i ); //чему равен а.i ?
}
Инициализирующая последовательность не подразумевает запуск конструктора (и наоборот). У конструктора как правило свой список инициализации, поэтому может возникать путаница, если сделать как Вы предлагаете:
Ответ: 1. Инициализация - это какими байтами забить кусок памяти под структуру. Далее вызывается конструктор.
Ответ: 1. Инициализация - это какими байтами забить кусок памяти под структуру. Далее вызывается конструктор.
Неправильный ответ - прогрессивный компилятор при инициализации последовательностью поместит i=2 в область памяти ReadOnly (поскольку i - const). И далее при вызове списка инициализации конструктора и попытке записи i=1 будет ошибка доступа к памяти
Неправильный ответ - прогрессивный компилятор при инициализации последовательностью поместит i=2 в область памяти ReadOnly (поскольку i - const). И далее при вызове списка инициализации конструктора и попытке записи i=1 будет ошибка доступа к памяти
Вы можете высказывать любое мнение. Вижу только искусственное ограничение. Уверен, что оба некомпетентны в этом вопросе. Боюсь, разработчики компилятора не пояснят.
Вы можете высказывать любое мнение. Вижу только искусственное ограничение. Уверен, что оба некомпетентны в этом вопросе. Боюсь, разработчики компилятора не пояснят.
Все правильно. В С++ есть агрегатная инициализация. Это то, что ты в {...} хочешь сделать. Она возможна с рядом исключений, одно из них: не должно user-provided или user-declared (в зависимости от стандарта) конструктора. В принципе тут частично, очень и очень упрощенно, сделаны все эти танцы с притопами вокруг вариантов инициализации в С++.
Всем привет. Заметил кое-что небольшое. В текущем билде при обращении к полю паблик структуры класса - автоподстановка не работает. Ставлю точку после имени структуры - и ничего, отображения имен её полей нет.
Вы можете высказывать любое мнение. Вижу только искусственное ограничение. Уверен, что оба некомпетентны в этом вопросе. Боюсь, разработчики компилятора не пояснят.
Есть и существенное более искусственные ограничения сомнительной полезности, например:
1. Число параметров макроса ограничено значением 8
#define MACRO(X1,X2,X3,X4,X5,X6,X7,X8,X9) //'X9' - too much parameters for macro
что не дает развернуться в полную силу. При этом даже в некоторых функция WinAPI - 12 параметров
2. В условной компиляции нельзя поставить пробел\табуляцию:
чтобы сразу было видно какой if к какому else и endif относится
3. В #import нельзя использовать макро
#define TEST_EX5 "test.ex5"struct A {};
#import TEST_EX5 //#import is expecting a filename
void f( A& );
#import
при этом, если использовать описание данных по месту нахождения каждой функции, то для одного и того же .ex5 #import нужно постоянно открывать\закрывать, что подразумевает макроподстановку, чтобы не перепутать
И что? Исправили ее? - Нет - потому что сочли несущественной. И действительно - в таком виде она выглядит как несущественная. Но по сути странно, что на #define перенос действует, а на остальной код - нет. Т.е действуют разные правила для разных частей программы... а зачем такое усложнение?
Кстати перенос строки на #define - с ошибкой работает. Пример с ним ошибки при выполнении:
Есть и существенное более искусственные ограничения сомнительной полезности, например:
1. Число параметров макроса ограничено значением 8
что не дает развернуться в полную силу. При этом даже в некоторых функция WinAPI - 12 параметров
2. В условной компиляции нельзя поставить пробел\табуляцию:
чтобы сразу было видно какой if к какому else и endif относится
3. В #import нельзя использовать макро
при этом, если использовать описание данных по месту нахождения каждой функции, то для одного и того же .ex5 #import нужно постоянно открывать\закрывать, что подразумевает макроподстановку, чтобы не перепутать
Когда-то было другое поведение. Что мешает сначала сделать инициализацию структуры, а затем запустить конструктор?
Инициализирующая последовательность не подразумевает запуск конструктора (и наоборот). У конструктора как правило свой список инициализации, поэтому может возникать путаница, если сделать как Вы предлагаете:
Инициализирующая последовательность не подразумевает запуск конструктора (и наоборот). У конструктора как правило свой список инициализации, поэтому может возникать путаница, если сделать как Вы предлагаете:
Ответ: 1. Инициализация - это какими байтами забить кусок памяти под структуру. Далее вызывается конструктор.
Ответ: 1. Инициализация - это какими байтами забить кусок памяти под структуру. Далее вызывается конструктор.
Неправильный ответ - прогрессивный компилятор при инициализации последовательностью поместит i=2 в область памяти ReadOnly (поскольку i - const). И далее при вызове списка инициализации конструктора и попытке записи i=1 будет ошибка доступа к памяти
Неправильный ответ - прогрессивный компилятор при инициализации последовательностью поместит i=2 в область памяти ReadOnly (поскольку i - const). И далее при вызове списка инициализации конструктора и попытке записи i=1 будет ошибка доступа к памяти
Вы можете высказывать любое мнение. Вижу только искусственное ограничение. Уверен, что оба некомпетентны в этом вопросе. Боюсь, разработчики компилятора не пояснят.
Вы можете высказывать любое мнение. Вижу только искусственное ограничение. Уверен, что оба некомпетентны в этом вопросе. Боюсь, разработчики компилятора не пояснят.
Все правильно. В С++ есть агрегатная инициализация. Это то, что ты в {...} хочешь сделать. Она возможна с рядом исключений, одно из них: не должно user-provided или user-declared (в зависимости от стандарта) конструктора. В принципе тут частично, очень и очень упрощенно, сделаны все эти танцы с притопами вокруг вариантов инициализации в С++.
PS. Кто хочет прикоснуться ко всему этому ужасу в оригинале, милости просим))): https://en.cppreference.com/w/cpp/language/initialization
Всем привет. Заметил кое-что небольшое. В текущем билде при обращении к полю паблик структуры класса - автоподстановка не работает. Ставлю точку после имени структуры - и ничего, отображения имен её полей нет.
Спасибо за внимание!
Вы можете высказывать любое мнение. Вижу только искусственное ограничение. Уверен, что оба некомпетентны в этом вопросе. Боюсь, разработчики компилятора не пояснят.
Есть и существенное более искусственные ограничения сомнительной полезности, например:
1. Число параметров макроса ограничено значением 8
что не дает развернуться в полную силу. При этом даже в некоторых функция WinAPI - 12 параметров
2. В условной компиляции нельзя поставить пробел\табуляцию:
чтобы сразу было видно какой if к какому else и endif относится
3. В #import нельзя использовать макро
при этом, если использовать описание данных по месту нахождения каждой функции, то для одного и того же .ex5 #import нужно постоянно открывать\закрывать, что подразумевает макроподстановку, чтобы не перепутать
Кстати перенос строки на #define - с ошибкой работает. Пример с ним ошибки при выполнении:
Результат: 4
Ожидалось: 8
Есть и существенное более искусственные ограничения сомнительной полезности, например:
1. Число параметров макроса ограничено значением 8
что не дает развернуться в полную силу. При этом даже в некоторых функция WinAPI - 12 параметров
2. В условной компиляции нельзя поставить пробел\табуляцию:
чтобы сразу было видно какой if к какому else и endif относится
3. В #import нельзя использовать макро
при этом, если использовать описание данных по месту нахождения каждой функции, то для одного и того же .ex5 #import нужно постоянно открывать\закрывать, что подразумевает макроподстановку, чтобы не перепутать
Так плохо?
Так плохо?
Пробовал так, но остановился на варианте целиком слева:
Так визуально легче отличить препроцессор от основного кода