Арифметическая операция с пустотой?

Я знаю, что следующее, если возможно, будет абсолютно плохой практикой, но я хочу знать, возможно ли это.

Вопрос в следующем: возможно ли в 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 */

Я знаю, что это глупо, но это не вопрос …

0

Решение

Я не уверен, что это имеет смысл, но ты мог использовать оператор запятой Вот:

int i = (v.resize(42), 42);
6

Другие решения

Вы могли бы использовать оператор запятой:

int i = (v.resize(42), 42);

и с НКУ Вы могли бы использовать его выражение выражения расширение:

int i = ({v.resize(42); 42;})

и в стандарте C ++ 11 Вы можете использовать и позвонить анонимному закрытие:

int i = ([&v]() {v.resize(42); return 42;}());
5

Тип void не имеет значений, поэтому его нельзя использовать в арифметических выражениях.

На мой взгляд дизайн функции члена resize плохо. Вместо voidон должен вернуть сам объект. В этом случае вы могли бы написать, например,

int i = v.resize(42).size();

Я указал на это на форуме, где обсуждается стандарт C ++.

Что касается вашего вопроса, то вы можете написать

int i = ( v.resize(42), v.size() );

используя оператор запятой.

Или, может быть, было бы лучше разделить эти два вызова

v.resize(42);
int i = v.size();
2

Не вижу смысла, но вот другой способ

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);

Да ладно, этому нет конца

…..

0