Ваше определение не кажется мне правильным. Идиома - это способ написать что-то, что может или не может быть возможным на других языках, но это является обычным явлением в этом языке. Обычно это короче, чем альтернатива, но это не является обязательным требованием.
Это может быть проще объяснить, говоря о том, что не является идиоматическим. В C ++ довольно идиоматично писать:
Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p)
{
// whatever
}
Еще более идиоматично писать:
Foo* p;
if(p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
{
// whatever
}
Этот код делает то же самое - некоторые новички в C ++ могут прочитать его как тестирование, чтобы увидеть, равно ли p тому, что возвращает функция, но это не то, что она делает.
Сравните с тем, что кто-то может написать, совсем не идиоматически, кто пришел с другого языка:
Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p !=NULL)
{
// whatever
}
Вы также увидите, что эти вещи выбиты как не-идиоматические:
if (x>0)
return true;
else
return false;
Потому что идиоматический подход
return (x>0);
Неидиоматические способы не являются неправильными, но они обычно занимают больше времени, чтобы печатать, и они всегда занимают больше времени, чтобы читать, для тех, кто знает идиомы. Если я назову вас «мальчиком, который плакал волком», и вы узнаете историю, это будет быстрее, чем если бы я объяснил, как ложные тревоги заставляют людей игнорировать вас. Проблема, конечно, в том, что если вы не знаете историю и не знаете, как волки связаны с тем, о чем мы говорим. Точно так же это может быть проблемой, если вы никогда не видели return x<y;
раньше и действительно не знаете, что он делает.