(*++argv) [0] - сместить указатель на следующую ячейку, провести разыменование этой ячейки, взять первый элемент по адресу в этой ячейке.argv имеет тип const char* const argv[]. В ячейках argv лежат элементы типа const char* const, для которых тоже характерны операторы разыменования и произвольного доступа. "". Лично я не вижу проблемы его вывести.std::cout << 'Hello, world''Hello, world' вообще не является ни строковым, ни символьным литералом. Это - значение с типом int. C2659 говорит о том, что ты пытаешься использовать имя функции как имя переменной. Это, в целом, абсолютно недопустимо.exit, но объявлена она в пространстве std, которое ты мог не подумавши раскрыть в глобальное пространство.exit. Ты вполне мог воспользоваться заголовком, где она описана.::exit является полной квалификацией имени с расположением в глобальном пространстве. Имя функции с большим приоритетом будет выбрано из глобального пространства.#pragma once буквально невозможно специфицировать в рамках стандарта и поэтому она не может быть стандартной.AssertEqueal является неполным. Это шаблон функции, но описания шаблонных параметров нет.ax^2 + bx + c = 0. Решаем, пишем: x = 42. И так далее.Assert - переводится как "Утверждать". Утверждать что-то. Значит, где-то должно быть утверждение. Но у AssertEqueal этого утверждения нет. Более того, имя функции переводится как "Утверждать равным". Чему равным?TerminateOnDifferent - выпилиться по разнице значений.Condition, условие. Правый - это Reference, норма/эталон.Terminate однозначно читается в контексте процесса. Прозрачно и то, что по наступлении эквивалентности выхода из этой функции не будет. Следовательно, все, что можно еще сделать, это передать семантику терминации в виде причины. Третий параметр - это Reason. Вот так, без всяких лишних hint и Msg, т.к. аргумент самодокументируется своим типом.template< typename TCondition, typename TReference >
void TerminateOnDifferent( TCondition&& condition, TReference&& reference, const std::string_view reason )
{
if( condition == reference )
{
return;
}
std::cout << "Termination happened due to reason: " << reason << "." << std::endl;
std::terminate();
} true вставлена как магическое значение. В другом месте новый параметр будет вычислен. Где-то еще значение будет прочитано из сетевого сокета или файла. T, u, в самом AssertEqual - ничего не отражающих именах. В изломанной структуре кода, в кривом выравнивании блоков. Только hint отражает свою суть, однако ничего не означает в контексте конструкции утверждений.
Пока я вижу что этот код даже не скомпилируется.