Как я понимаю, старый стиль, когда константы определялись виде #define — деканонизировали и предали анафеме. Теперь есть constexpr.
constexpr для времени компиляции, хотя тип проверяется. Вообще зачем это нужно — можете ли пример привести? Вроде режим компиляции — это отдельный тьюринг-полный язык, но нафига?
Всегда ли вы используете constexpr для констант?
Почему не использовать просто const, который времени выполнения?
Здравствуйте, Shmj, Вы писали:
S>Как я понимаю, старый стиль, когда константы определялись виде #define — деканонизировали и предали анафеме. Теперь есть constexpr.
Задолго до появления constextr для определения констант было общепринято использовать просто const. Ты, как обычно, слышал звон, но не знаешь, где он. Почитал бы что-нибудь, что ли.
Здравствуйте, Shmj, Вы писали:
S>Почему не использовать просто const, который времени выполнения?
Чтоб не тратить время при старте приложения.
Более правильная постановка вопроса: почему бы вместо этого мета-онанизма, который пишется как бы на особом языке, не использовать внешний скрипт с кодогенерацией, который и рассчитает все эти константы?
Здравствуйте, T4r4sB, Вы писали:
TB>Где гарантия, что результат будет вычислен при компиляции? Есть какой-то список операций, дающий гарантию?
Есть такие места, где кроме констант компиляции ничего больше использовать нельзя, например, параметры шаблонов, значения перечислений, ключи оператора switch, размеры массивов и пр. Вот эти места, собственно, и являлись гарантами.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Есть такие места, где кроме констант компиляции ничего больше использовать нельзя, например, параметры шаблонов, значения перечислений, ключи оператора switch, размеры массивов и пр. Вот эти места, собственно, и являлись гарантами.
Ну допустим, я напишу
int a[2+3];
Какой шанс, что какой-то компилятор не захочет складывать 2+3? И что говорит стандарт?
Здравствуйте, rg45, Вы писали:
R>По моим оценкам, шансы близки к нулю, если компилятор хоть немного вменяемый, конечно.
Ну нужны не оценки, а гарантия на уровне стандарта, что компилятор сможет сложить константы.
Вроде тут есть: https://en.cppreference.com/w/cpp/language/constant_expression
То есть читаешь 37 пунктов, сложения констант там нет, значит компилятор обязан справиться
Здравствуйте, T4r4sB, Вы писали:
TB>Ну нужны не оценки, а гарантия на уровне стандарта, что компилятор сможет сложить константы. TB>Вроде тут есть: https://en.cppreference.com/w/cpp/language/constant_expression TB>То есть читаешь 37 пунктов, сложения констант там нет, значит компилятор обязан справиться
о том, что модификатор const можно использовать для объявления констант времени компиляции? Хорошо, давай допустим невероятное: компилятор не смог сложить константы — это как-то противоречит тому, что сказал я?
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, T4r4sB, Вы писали:
TB>Отсутствием гарантий, что компилятор действительно вычислит константу.
Для меня гарантии — это то как я могу использовать объявленную сущность, что я могу с ней делать. Мне важно, чтоб я мог ее использовать в определенных местах, где по нормам языка заявлено использование константных выражений:
const int N = 42;
enum E { e = N };
int a[N] {};
std::array<int, N> ar{};
switch (val)
{
case N: . . .
}
Если компилятор сможет каким-то магическим образом обеспечить мне такое использование без вычисления константы, то на здоровье — я все равно этого никак не почувствую.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, T4r4sB, Вы писали:
R>>По моим оценкам, шансы близки к нулю, если компилятор хоть немного вменяемый, конечно.
TB>Ну нужны не оценки, а гарантия на уровне стандарта, что компилятор сможет сложить константы. TB>Вроде тут есть: https://en.cppreference.com/w/cpp/language/constant_expression TB>То есть читаешь 37 пунктов, сложения констант там нет, значит компилятор обязан справиться
А давно в плюсики завезли массивы переменного размера? Чтобы в рантайме считалось?
Здравствуйте, rg45, Вы писали:
П>>А давно в плюсики завезли массивы переменного размера? Чтобы в рантайме считалось?
R>Только как расширения. По стандарту только константные размеры предусмотрены.
Ну вот я именно про это. Если компилятор не может вычислить эту константу, он должен сложить лапки
Здравствуйте, Shmj, Вы писали:
S> constexpr для времени компиляции, хотя тип проверяется. Вообще зачем это нужно — можете ли пример привести? Вроде режим компиляции — это отдельный тьюринг-полный язык, но нафига?
Здравствуйте, Shmj, Вы писали:
S>Как я понимаю, старый стиль, когда константы определялись виде #define
коллега (даже не читая ответы, то, что вы употребили есть препроцссор — вещь изначально не относящаяся к языку, т.е. в АСТ оно не попадает, оно генерирует то. что попадет в АСТ).
да а слово (ключевое) const именно с языка.
Здравствуйте, rg45, Вы писали:
R>Если компилятор сможет каким-то магическим образом обеспечить мне такое использование без вычисления константы, то на здоровье — я все равно этого никак не почувствую.
А если при попытке использовать другой компилятор окажется, что константа не вычислилась, то почувствуешь.
Здравствуйте, rg45, Вы писали:
R> А если динозавр, то бабушка может стать дедушкой.
Алё, я говорю, что если ты пишешь int a[2+3], то желательно иметь гарантию на уровне Стандарта, что выражение в квадратных скобках вычислится компилятором, что непонятного-то?
Здравствуйте, T4r4sB, Вы писали:
TB>Алё, я говорю, что если ты пишешь int a[2+3], то желательно иметь гарантию на уровне Стандарта, что выражение в квадратных скобках вычислится компилятором, что непонятного-то?
Але, как твои 2+3 соотносятся с моим утверждением, что при помощи const можно определять константы времени компиляции?
Ну допустим, не смог компилятор сложить два числа, дальше что?
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Але, как твои 2+3 соотносятся с моим утверждением, что при помощи const можно определять константы времени компиляции?
Твоё утверждение не является полным без упоминания того факта, что const не даёт никакой гарантии. То есть может определять, а может не определять.
R>Ну допустим, не смог компилятор сложить два числа, дальше что?
Здравствуйте, T4r4sB, Вы писали:
TB>Твоё утверждение не является полным без упоминания того факта, что const не даёт никакой гарантии. То есть может определять, а может не определять.
Все правильно, может определять, а может не определять, вот поэтому я и написал
же сообщении про модификатор const говорится, что это "просто const, который времени выполнения", что эквивалентно утрверждению "не может определять константу времени компиляции". Утверждалось, что не может, а я утверждаю, что может. У тебя как с логикой вообще?
R>>Ну допустим, не смог компилятор сложить два числа, дальше что? TB>А дальше ошибка компиляции.
Как ошибка при компиляции записи "int a[2+3]" опровергает утверждение "модификатор const МОЖЕТ определять константу времени компиляции"?
P.S. На всякий случай, для доказательства того, что модификатор const МОЖЕТ использоваться для определения констант времени компиляции, достаточно какого-нибудь одного примера:
Здравствуйте, rg45, Вы писали:
R>Как ошибка при компиляции записи "int a[2+3]" опровергает утверждение "модификатор const МОЖЕТ определять константу времени компиляции"?
Фразы надо проговаривать до конца, не вырывая из контекста, согласен? Потому что в живом языке если нету дополнения, что что-то может быть не так, то это неоднозначность как минимум. Если просто сказать "может определять константу времени компиляции", то можно подумать, что это обязательно будет определять константу времени компиляции, ведь обратного не сказано.
Здравствуйте, T4r4sB, Вы писали:
TB>Фразы надо проговаривать до конца, не вырывая из контекста, согласен? Потому что в живом языке если нету дополнения, что что-то может быть не так, то это неоднозначность как минимум. Если просто сказать "может определять константу времени компиляции", то можно подумать, что это обязательно будет определять константу времени компиляции, ведь обратного не сказано.
Нет, нельзя так подумать. "Может определять константу времени компиляции" и "обязательно будет определять константу времени компиляции" — это разные высказывания. У человека, для котого из первого высказывания следует второе, явно что-то не в порядке с логикой.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>У человека, для котого из первого высказывания следует второе, явно что-то не в порядке с логикой.
Не, у него обычная логика, заточенная за житейское понимание фраз человеческого языка.
Твоя фраза попросту неполная.
И всё, что не оговорено, можно понимать как угодно.
Чтоб не было неоднозначностей, следует говорить так: "Может определять константу времени компиляции, но не обязано".
Здравствуйте, T4r4sB, Вы писали:
TB>Не, у него обычная логика, заточенная за житейское понимание фраз человеческого языка.
А при чем тут он? Речь о тебе.
TB>Твоя фраза попросту неполная. TB>И всё, что не оговорено, можно понимать как угодно. TB>Чтоб не было неоднозначностей, следует говорить так: "Может определять константу времени компиляции, но не обязано".
Все, что не оговорено — не оговорено не просто так, а потому, что просто не имеет значения в данном контексет. Фраза "Может определять константу времени компиляции" обладает необходимой полнотой в данном контексте. То, что у тебя возникают трудности с ее пониманием, определенно указывает на проблемы с логикой.
--
Не можешь достичь желаемого — пожелай достигнутого.
Ты начал нервничать и вести себя агрессивно гораздо раньше, примерно с "Re[7]: constexpr" (если что, я нихрена не могу понять, как тут делать ссылки на сообщения)
Здравствуйте, T4r4sB, Вы писали:
TB>Ты начал нервничать и вести себя агрессивно гораздо раньше, примерно с "Re[7]: constexpr"
В чем выразилось то, что я начал нервничать? Я в упор здесь не наблюдаю поводов для того, чтоб нервничать, вот честно. По-моему, ты просто спроецировал на меня свое собственное состояние, вот и все.
А агрессия? Агрессия же точно должна была иметь какое-то явное выражение, а не просто потому что тебе так захотелось?
TB>(если что, я нихрена не могу понять, как тут делать ссылки на сообщения)
А ты не нервничай, и сразу поймешь
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>В чем выразилось то, что я начал нервничать? Я в упор здесь не наблюдаю поводов для того, чтоб нервничать, вот честно. По-моему, ты просто спроецировал на меня свое собственное состояние, вот и все.
Я был 100% нейтрален до этого твоего сообщения:
А я стесняюсь спросить, как твой вопрос связан с моим утверждением о том, что модификатор const можно использовать для объявления констант времени компиляции? Хорошо, давай допустим невероятное: компилятор не смог сложить константы — это как-то противоречит тому, что сказал я?
В этой цитате как минимум есть ерничество, сарказм, короче все признаки того, что ты взбесился и стал прыгать по потолку просто от того, что я уточнил твою фразу, и теперь ведёшь идиотский спор по поводу значений слов, на который мне в общем-то насрать.
Тебе 15 лет что ли?
TB>А я стесняюсь спросить, как твой вопрос связан с моим утверждением о том, что модификатор const можно использовать для объявления констант времени компиляции? Хорошо, давай допустим невероятное: компилятор не смог сложить константы — это как-то противоречит тому, что сказал я?
TB>В этой цитате как минимум есть ерничество, сарказм, короче все признаки того, что ты взбесился и стал прыгать по потолку просто от того, что я уточнил твою фразу, и теперь ведёшь идиотский спор по поводу значений слов, на который мне в общем-то насрать.
Где ту ерничество и сарказм? Где тут признаки, что я взбесился? Ты часом не свое ли состояние описываешь?
TB>Тебе 15 лет что ли?
Я думаю, что когда мне было 15 лет, тебя и на свете еще не было. Так что, будь повежливее, юноша.
P.S. Так а что с агрессией, о которой ты говорил здесь
Здравствуйте, rg45, Вы писали:
R>Где ту ерничество и сарказм?
Ну вот же: "я стесняюсь спросить", "допустим невероятное". Как будто в каждом моём ответе ты видишь угрозу, что кто-то засомневается в твоей компетентности. Успокойся, на самом деле я сомневаюсь в ней давно, а не после твоих ответов в этой теме.
R>Где тут признаки, что я взбесился? Ты часом не свое ли состояние описываешь?
То, что ты лезешь в залупу, даже после того, как я написал ещё несколько ответов достаточно нейтрально.
R>Я думаю, что когда мне было 15 лет, тебя и на свете еще не было. Так что, будь повежливее, юноша.
Я в жизни видел таких где-то 20+ -летнего возраста, так что мне-то не гони.
Здравствуйте, T4r4sB, Вы писали:
TB>То, что ты лезешь в залупу, даже после того, как я написал ещё несколько ответов достаточно нейтрально.
Что ж тебе залупы то везде видятся. Может, у тебя там за щекой залупа? Выплюнуть не пробовал?
TB>Я в жизни видел таких где-то 20+ -летнего возраста, так что мне-то не гони.
Спорить будем или зассышь?
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Что ж тебе залупы то везде видятся. У тебя за щекой там залупа, что ли? Так ты выплюни вот и все проблемы. R>Спорить будем или зассышь?
объясните мне, пожалуйста, почему следует избегать макросов?
доводы из статьи по ссылке я встречал много раз.
меня они не убеждают и входят в противоречие с моим личным опытом.
я не претендую на звание эксперта по С++, но в своей работе я много работаю с кодом на этом языке.
специфика такая, что мне приходится работать со старым (10+ лет) и очень старым (20+ лет) кодом разного качества.
объясню своё непонимание на примере доводов из статьи по ссылке выше:
Основная проблема с макросами С++ заключается в том, что они выглядят гораздо привлекательнее, чем являются таковыми на самом деле. Макросы игнорируют области видимости, игнорируют прочие возможности и правила языка, и заменяют все символы, которые переопределяют при помощи директивы #define, до самого конца файла. Применение макросов внешне походит на имя или вызов функции, но не имеет с ними ничего общего. Макросы "негигиеничны", в том смысле, что они могут быть раскрыты неожиданно, причем превратиться в зависимости от контекста их использования в самые разные конструкции. Подстановка текста, выполняемая макросами, делает написание хотя бы в небольшой степени "приличного" макроса смесью искусства и черной магии.
да, написание годного макроса это действительно сложнее, чем кажется на первый взгляд.
и я согласен, что корявый макрос может быть причиной множества различных проблем с компиляцией кода.
однако, по моему опыту, навести порядок в макросах не так уж и сложно, здесь автор сильно драматизирует.
написать хороший макрос тоже не очень сложно.
на мой взгляд, хороший шаблонный код писать никак не проще.
понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.
Программисты, которые полагают, что тяжелее всего расшифровать ошибки, связанные с шаблонами, вероятно, просто никогда не имели дела с плохо написанными или неверно использованными макросами. Шаблоны являются частью системы типов С++, и тем самым позволяют компилятору куда лучше справляться с ними, чем с макросами, которые имеют мало общего с языком программирования. Хуже того, в отличие от шаблонов неверные макросы могут быть раскрыты в нечто, что в силу чистой случайности скомпилируется, не имея при этом никакого смысла. И наконец, ошибка в макросе обнаруживается только после того, как макрос раскрывается, а не при его определении.
по моему опыту, мне существенно больше проблем всегда доставлял тот код, который злоупотребляет шаблонами, нежели тот, который злоупотребляет макросами.
при переносе кода, широко использующего шаблоны, с одной версии компилятора на другую версию того же компилятора или с одного компилятора на другой проблемы с шаблонами возникают часто.
проблем же с макросами при смене компилятора я никогда не видел.
это что касается портирования на другие компиляторы, однако и при отладке кода макросы мне никогда особых проблем не доставляли.
в конце концов, макросы всегда можно раскрыть в нужной части кода и найти ошибку.
однако понять, что не так при ошибке компиляции иных шаблонов, особенно в компиляторах MSVC не самых свежих, мне гораздо сложнее, чем разобраться в коде с макросами.
при этом нет никакого средства, чтобы раскрыть шаблон и превратить его в нешаблонный код.
Здравствуйте, LuciferSaratov, Вы писали:
R>>А вот тебе про #define: 16. Избегайте макросов
LS>объясните мне, пожалуйста, почему следует избегать макросов? LS>доводы из статьи по ссылке я встречал много раз. LS>меня они не убеждают и входят в противоречие с моим личным опытом. LS>я не претендую на звание эксперта по С++, но в своей работе я много работаю с кодом на этом языке. LS>специфика такая, что мне приходится работать со старым (10+ лет) и очень старым (20+ лет) кодом разного качества.
"Избегайте" не означает же "полностью исключите". "Избегайте" означает, не употребляйте там, где без этого легко можно обойтись. Почему так — в статье написано достаточно хорошо, по-моему. Макросы не подчиняются правилам областей видимости, на функциональные макросы не распространяется ADL, для макросов нельзя использовать перегрузку и концепты и пр. Если статья не убеждает, то у меня тоже вряд ли получится.
Есть такие случаи, когда без макросов просто никак, например, описание разного рода типов со статической структурой. Использование макросов может придать таким описаниям очень приятный декларативный вид, легко изменяемый и расширяемый и избавить от написания громадного количества сопровождающего кода, такого как загрузка-выгрузка, сериализация-десериализация, операции разные — сравнения, сложения, вычитания, вывода-вывода и пр. Но это же не значит, что нужно начать повсеместно использовать макросы вместо констант и функций.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, LuciferSaratov, Вы писали:
LS>да, написание годного макроса это действительно сложнее, чем кажется на первый взгляд. LS>и я согласен, что корявый макрос может быть причиной множества различных проблем с компиляцией кода. LS>однако, по моему опыту, навести порядок в макросах не так уж и сложно, здесь автор сильно драматизирует. LS>написать хороший макрос тоже не очень сложно.
Порядок порядок подключения заголовочных файлов может очень сильно все поменять, как бы вы хорошо не писали.
LS>на мой взгляд, хороший шаблонный код писать никак не проще.
Зато он предсказуемей.
LS>понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.
Сложные задачи — сложные средства.
Здравствуйте, LuciferSaratov, Вы писали:
LS>однако, по моему опыту, навести порядок в макросах не так уж и сложно, здесь автор сильно драматизирует.
А как можно навести порядок в макросах?
Пример из практики: в проекте используются две сторонние библиотеки и обе из них определяют один и тот же define но в разные значения. Как разрешить коллизию?
LS>написать хороший макрос тоже не очень сложно. LS>на мой взгляд, хороший шаблонный код писать никак не проще. LS>понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.
Так вроде как макросы — это не вопрос сложности. Это скорее вопрос безопасности.
LS>по моему опыту, мне существенно больше проблем всегда доставлял тот код, который злоупотребляет шаблонами, нежели тот, который злоупотребляет макросами. LS>при переносе кода, широко использующего шаблоны, с одной версии компилятора на другую версию того же компилятора или с одного компилятора на другой проблемы с шаблонами возникают часто. LS>проблем же с макросами при смене компилятора я никогда не видел.
— ok для Linux, но на windows: ERROR — это дефайн в константу и код не скомпилируется (зависит от порядка includ'ов)
Ну и классика по функциям и дефайнам min и max, из-за чего декларация этих функций выглядит нестандартно под windows: отсюда
_EXPORT_STD template <class _Ty>
class numeric_limits : public _Num_base { // numeric limits for arbitrary type _Ty (say little or nothing)public:
_NODISCARD static constexpr _Ty(min)() noexcept { // Шеф! Шеф! Что это было!?return _Ty();
}
_NODISCARD static constexpr _Ty(max)() noexcept { // Шеф! Шеф! Что это было!?return _Ty();
}
_NODISCARD static constexpr _Ty lowest() noexcept {
return _Ty();
}
_NODISCARD static constexpr _Ty epsilon() noexcept {
return _Ty();
}
LS>это что касается портирования на другие компиляторы, однако и при отладке кода макросы мне никогда особых проблем не доставляли. LS>в конце концов, макросы всегда можно раскрыть в нужной части кода и найти ошибку.
Ага. Занятие часа на 4: вспомнить опцию компилятора, настроить переменные окружения, запустить компиляцию этого отдельного файла и по косвенным признакам найти результат подстановки...
LS>однако понять, что не так при ошибке компиляции иных шаблонов, особенно в компиляторах MSVC не самых свежих, мне гораздо сложнее, чем разобраться в коде с макросами. LS>при этом нет никакого средства, чтобы раскрыть шаблон и превратить его в нешаблонный код.
С шаблонами сложнее, но зато шаблоны — намного более мощный инструмент.
Здравствуйте, T4r4sB, Вы писали:
TB>Где гарантия, что результат будет вычислен при компиляции? Есть какой-то список операций, дающий гарантию?
Да, есть: consteval
Здравствуйте, wander, Вы писали:
W>Здравствуйте, rg45.
W>Зря ты с ним сцепился. У человека govnokod.ru из головы все никак не выветрится.
То есть ты считаешь, что неадекватное поведение рг45 это ок что ли?
Я вижу его сообщения в лучшем случае как " да как ты посмел уточнить то что я говорю и усомниться в полноте моих высказываний111", не так что ли?
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, T4r4sB, Вы писали:
TB>>Где гарантия, что результат будет вычислен при компиляции? Есть какой-то список операций, дающий гарантию? BFE>Да, есть: consteval
О боже, скольно ж там теперь видов констант, отличия которых поймет только гурман
Здравствуйте, Shmj, Вы писали:
S>Как я понимаю, старый стиль, когда константы определялись виде #define — деканонизировали и предали анафеме. Теперь есть constexpr.
S>Вообще зачем это нужно — можете ли пример привести?
Ты когда константы заводишь, как их описываешь?
Второе легче читается, плюс на consexpr можно нормально стиль использовать, ChunkSize, не боясь что макрос где то что то попортит, а дальше логика проста, есть зависимые константы которые хочется легко и понятно описать, чтобы их было можно легко и понятно поддерживать, и нужны уже функции времени компиляции.
S>Почему не использовать просто const, который времени выполнения?
Это разные вещи, const != consexpr, #define != constexpr. static не входит в constexpr, вот это кстати было удивительно узнать, почему по умолчанию consexpr это не static inline consexpr.
Здравствуйте, T4r4sB, Вы писали:
TB>То есть ты считаешь, что неадекватное поведение рг45 это ок что ли?
Я считаю, что неадекватно себя вести сначала начал ты.
Свое отношение к реакции рг45 на твой выпад в #12 (и особенно в #16) я уже высказал и получил от него адекватный ответ.
TB>Я вижу его сообщения в лучшем случае как " да как ты посмел уточнить то что я говорю и усомниться в полноте моих высказываний111", не так что ли?
Это только твое восприятие.
W>Свое отношение к реакции рг45 на твой выпад в #12 (и особенно в #16) я уже высказал и получил от него адекватный ответ.
Его хамство в re7 и re9 ты в упор не видишь? Или ему можно? Это твой друг что ли?
Адекватный ответ — это кукушка хвалит петуха за то что хвалит он кукушку?
Что не так в ре16? Я спокойно сказал что его фраза может быть понята неоднозначно с точки зрения норм русского языка, что тут блин не так?
Здравствуйте, T4r4sB, Вы писали:
TB>Его хамство в re7 и re9 ты в упор не видишь?
Там нет никакого хамства. TB>Или ему можно?
Нет, ему не можно. Но хамства там нет. TB>Это твой друг что ли?
Нет. Вообще ни разу. Мы за послоедние 10 лет едва ли парой фраз перекинулись и то только в этом разделе.
Просто ты несправедливо прикопался на ровном месте, вот я и среагировал.
TB>Адекватный ответ — это кукушка хвалит петуха за то что хвалит он кукушку?
Что?
Человек согласился, что зря ввязался в словесную перепалку с тобой.
Это адекватный ответ, потому что соответствует действительности.
Адекватный человек от неадекватного отличается как раз тем, что способен принять действительность.
TB>Что не так в ре16? Я спокойно сказал что его фраза может быть понята неоднозначно с точки зрения норм русского языка, что тут блин не так?
Вместо того, чтобы уточнить суть непонятного в словах оппонента, ты начинаешь упрекать его в неправильном применении норм русского языка.
Я уж помолчу о том, что никакой неоднозначности с точки зрения норм тут нет, это ладно.