Я знаю, что следующее, если возможно, будет абсолютно плохой практикой, но я хочу знать, возможно ли это.
Вопрос в следующем: возможно ли в C ++ (и таким образом компилятор не выдает никакого предупреждения) выполнить бесполезную арифметическую операцию с функцией, возвращающей void.
std::vector<int> v;
int i = 42 + v.resize(42);
/* How to transform the last line to execute resize and to have i = 42 */
Я знаю, что это глупо, но это не вопрос …
Я не уверен, что это имеет смысл, но ты мог использовать оператор запятой Вот:
int i = (v.resize(42), 42);
Вы могли бы использовать оператор запятой:
int i = (v.resize(42), 42);
и с НКУ Вы могли бы использовать его выражение выражения расширение:
int i = ({v.resize(42); 42;})
и в стандарте C ++ 11 Вы можете использовать и позвонить анонимному закрытие:
int i = ([&v]() {v.resize(42); return 42;}());
Тип void не имеет значений, поэтому его нельзя использовать в арифметических выражениях.
На мой взгляд дизайн функции члена resize
плохо. Вместо void
он должен вернуть сам объект. В этом случае вы могли бы написать, например,
int i = v.resize(42).size();
Я указал на это на форуме, где обсуждается стандарт C ++.
Что касается вашего вопроса, то вы можете написать
int i = ( v.resize(42), v.size() );
используя оператор запятой.
Или, может быть, было бы лучше разделить эти два вызова
v.resize(42);
int i = v.size();
Не вижу смысла, но вот другой способ
std::tie(i, std::ignore) = std::make_tuple(42, (v.resize(42),1) );
Также вы можете сделать:
if ((i=42)) v.resize(42);
И не забывай
do { v.resize(42); } while (!(i=42));
И любимый
(i=42) ? v.resize(42) : i;
Или (единственный серьезный с ++ в посте)
int i(0);
std::vector<int> v(i=42);
Да ладно, этому нет конца
…..